問題描述:
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
