zoukankan      html  css  js  c++  java
  • 转:django3上线部署踩得坑

    django3上线部署踩的坑

     

    好久没有用过django写项目了,最近公司开发个官网,一时兴起就拿来练练手,这不用不知道,一用吓一跳啊。

    才多久,版本都到3.0了。

    踩坑一:运行项目时失败报错,后来查找资料发现, 当你使用django2.2及以后版本的时候,连接数据库会报如下的一个错误:

    django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.2.

    这是django2.2及以后内部的一个版本限制在作怪

      django2.2不支持pyMySQL,但2.2是LTS,想过试试mysqldb,但是MySQLDB又不支持python3。。。。

    解决办法如下:

    找到/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/django/db/backends/mysql/base.py路径下

    将这两行注掉,如果是3版本的话这样就可以了,2.2的话

    #if version < (1, 3, 13):
    #    raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__version__)

    如果是3版本的话这样就可以了,2.2的话还会报错

    site-packagesdjangodbackendsmysqloperations.py”, line 146, in last_executed_query   
    query = query.decode(errors=‘replace’)   
    AttributeError: ‘str’ object has no attribute ‘decode’   
    解决办法:
    打开此文件把146行的decode修改为encode

    此外,还有一个比较麻烦的是,在创建表关系的时候,有一个参数要加上,不然会报错的   

    TypeError: __init__() missing 1 required positional argument: 'on_delete'

    修改为:

    user_id = models.OneToOneField("User", on_delete=models.CASCADE, to_field='id') 

    踩坑二:项目开发完了是不是要上线,这是我就想到了现在常用的网红搭配:Nginx + MySql + Gunicorn + Django3.0.4,想法是好的,可是天不随人愿啊,到底还是有问题,项目启动以后,发现静态文件访问不了:

    看setting文件,主要的配置都在:

    复制代码
    DEBUG = True
    
    
    TIME_ZONE = 'Asia/Shanghai'
    # TIME_ZONE = 'UTC'
    
    
    STATIC_URL = '/static/'  # html 静态文件夹
    
    # REST_FRAMEWORK = {
    #     "DEFAULT_AUTHENTICATION_CLASSES": ["back.auth.TokenAuthentication", ]
    # }
    
    APPEND_SLASH = True  # 默认等于True,等于Flase时,不会为URL末尾自动添加/
    STATICFILES_DIRS = [
        os.path.join(BASE_DIR, "static"), # 静态文件存放位置
    ]
    
    STATIC_ROOT = os.path.join(os.path.dirname(__file__),'static')
    复制代码

    经过和小伙伴一番讨论终于得知

    Gunicorn+Django部署后,启动gunicorn时会关闭django的debug模式,这时无论是访问前台页面还是后台的admin管理页面,静态文件都会失效

    复制代码
    启动命令 
    gunicorn  -c gunicorn.conf xxxx.wsgi -preload
    
    
    gunicorn.conf
    
    import os
    import multiprocessing
    bind = '0.0.0.0:8002'      #绑定ip和端口号
    worker_class = 'gevent' #使用gevent模式,还可以使用sync 模式,默认的是sync模式
    workers = multiprocessing.cpu_count() * 2 + 1    #进程数
    threads = 2 #指定每个进程开启的线程
    复制代码

    随后经过度娘的帮助终于找到了解决的办法:

    解决办法一:

    在urls文件里加上如下代码:

    复制代码
    from django.contrib.staticfiles.urls import staticfiles_urlpatterns
    
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('', views.Index.as_view({'get': 'index'})),
        path('api/v1/', include(('back.urls', 'back'), namespace='back')),
    ]
    
    
    urlpatterns += staticfiles_urlpatterns()
    urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
    复制代码

    解决办法二:

    就是把资源托管交给web服务器,在这里就是nginx

    具体配置如下:

    复制代码
    server {
        listen    80;
        server_name    www.xxxxx.com;
        location / {
            proxy_pass  http://localhost:0000;
            }
        location /static{
            alias /home/xxxxx/xxxxxx/xxxxxxx/static;
            }
        }
    复制代码

    到此圆满解决。长舒一口气!!!!!

  • 相关阅读:
    《软件性能测试与LoadRunner实战教程》新书上市
    《你必须掌握的Entity Framework 6.x与Core 2.0》正式出版感想
    《你必须掌握的Entity Framework 6.x与Core 2.0》书籍出版
    别跟我谈EF抵抗并发,敢问你到底会不会用EntityFramework
    EntityFramework Core 运行dotnet ef命令迁移背后本质是什么?(EF Core迁移原理)
    已被.NET基金会认可的弹性和瞬态故障处理库Polly介绍
    WebAPi之SelfHost自创建证书启动Https疑难解惑及无法正确返回结果
    Web APi之认证(Authentication)两种实现方式【二】(十三)
    读懂操作系统之虚拟内存TLB与缓存(cache)关系篇(四)
    读懂操作系统之缓存原理(cache)(三)
  • 原文地址:https://www.cnblogs.com/wangyuxing/p/14524168.html
Copyright © 2011-2022 走看看