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-packages\django\db\backends\mysql\operations.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;
        }
    }

 

到此圓滿解決。長舒一口氣!!!!!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM