好久沒有用過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; } }
到此圓滿解決。長舒一口氣!!!!!