配置Django框架為生產環境的注意事項(DEBUG=False)
問題描述:
Django1.10版本中框架中settings.py配置檔案
配置檔案settings.py配置了下面兩項:
DEBUG= False ALLOWED_HOSTS = ['*'] #這樣可以讓所有來源的ip訪問到後臺
使用 python3 manager.py runserver後訪問,發現沒有css,js樣式。
網上查詢得知:Django 關閉DEBUG模式後,就相當於是生產環境了,Django官網上指出如果是django框架一旦作為生產環境,那麼它的靜態檔案訪問介面就不應該從Django框架中走了,應該有獨立的web環境,首推nginx 。
我們知道在開發過程中,開發人員都喜歡在框架的根目錄下建立一個statics目錄,目錄在根據裡面有幾個APP建立對應APP程式靜態檔案目錄。
舉例如圖:
但是一旦放到生產環境(也就是關閉掉DEBUG模式),你在nginx中就要單獨做訪問/static/目錄的路由。nginx配置如下:
server { listen 80; server_name 127.0.0.1 charset UTF-8; access_log /var/log/nginx/django_pro01_access.log; error_log /var/log/nginx/django_pro01_error.log; client_max_body_size 75M; location / { include uwsgi_params; uwsgi_pass 127.0.0.1:8000; uwsgi_read_timeout 2; } location /static { #這裡做了訪問靜態目錄不走uwsgi expires 30d; autoindex on; add_header Cache-Control private; alias /usr/share/nginx/TengLan/TengLan/staticfiles; ##alias /usr/share/nginx/django_pro01/static/; } }
看到沒有,這一個Django框架中的所有靜態檔案都應該從這個 “/usr/share/nginx/TengLan/dTengLan/staticfiles” 目錄中獲取。
那麼我們就應該把開發人員在開發過程中所建立的所有靜態目錄放到一個目錄下。
於是人性化的Django框架,就想到這一步。就是讓你配置一個靜態目錄的根目錄:STATIC_ROOT,
配置如下:
PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__)) # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/1.9/howto/static-files/ STATIC_ROOT = os.path.join(PROJECT_ROOT, 'staticfiles') STATIC_URL = '/static/' # Extra places for collectstatic to find static files. STATICFILES_DIRS = ( os.path.join(BASE_DIR, 'static'), )
然後配置好後,再執行
python3 manage.py collectstatic
這個命令的執行目的,就是將在開發模式中定義的靜態目錄,統一拿到STATIC_ROOT目錄下。
1.首先從Django的擴充套件包中,將admin管理後臺的jss 和css等靜態檔案拷貝到配置檔案中的STATIC_ROOT目錄下。
2.然後將STATICFILES_DIRS 列表中所有目錄下的內容也拷貝到STATIC_ROOT目錄下
靜態目錄拷貝後的結果如圖:
對是拷貝,不是剪下,所以生產中最好把開發測試目錄過濾掉在放到生產環境。
網上有很多關於 STATIC_ROOT目錄 和 STATICFILES_DIRS的錯誤理解:有說是STATICFILES_DIRS列表中的目錄是放多個APP共用的靜態目錄列表。而STATIC_ROOT是APP獨享靜態目錄。這種事錯誤的說法。
正確的解釋是:
STATICFILES_DIRS 列表中的目錄是開發時建立的靜態目錄。
STATIC_ROOT 是Django框架放到生產環境中的唯一的一個靜態目錄
而當你設定DEBUG=False時,就必須在Django框架前端部署nginx或者其他web伺服器來提供靜態訪問入口
看看官網的說明如下連結https://devcenter.heroku.com/articles/django-assets
碼農小明