Django靜態文件的加載以及STATIC_ROOT 與STATICFILES_DIRS的區別


Djangon生產環境靜態資源的處理

Django 關閉DEBUG模式后(即DEBUG=False),就相當於是生產環境了。

Django框架一旦作為生產環境,它的靜態文件訪問接口就不應該從Django框架中走,必須在Django框架前面部署nginx或者其他web服務器來提供靜態訪問入口

 

最佳配置方式

最佳的配置方式是將所有的App 下面的靜態文件統一放置到一個目錄(在項目目錄下創建staticfiles文件夾)下面,然后將該目錄設置為STATICFILES_DIRS,STATIC_ROOT則設置為另外的目錄:

# 對外提供WEB訪問時的URL地址
STATIC_URL = '/static/'
# 開發階段放置項目自己的靜態文件,不能包含STATIC_ROOT路徑,STATIC_ROOT 與 STATICFILES_DIRS的路徑不能重復
STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'staticfiles'),
)
# 執行collectstatic命令后會將項目中的靜態文件(包括STATICFILES_DIRS、自帶admin的靜態文件)收集到該目錄下面來(所以不應該在該目錄下面放置自己的一些靜態文件,因為會覆蓋掉)
STATIC_ROOT = os.path.join(BASE_DIR, 'static')

在開發階段Django把/static 映射到django.contrib.staticfiles這個App,django.contrib.staticfiles自動地從STATICFILES_DIRS、STATIC_ROOT以及各個App的static子目錄里面搜索靜態文件。

一旦部署到生產環境上,settings.py不需要重新編寫,只要在Nginx的配置文件里面寫好映射,/static將會被Nginx處理。django.contrib.staticfiles雖然仍然存在,但因為不會接收到以/static/開始的路徑,所以將不會產生作用。不必擔心Django會使處理速度變慢。

當settings.DEBUG設置成False的時候,staticfiles將自動關閉。

 

匯集靜態資源到指定目錄

運行 python manage.py collectstatic 命令,將在開發模式中定義的靜態目錄,統一拿到STATIC_ROOT目錄下,對外提供“/static”(STATIC_URL)為訪問URL:

  1.首先從Django的擴展包中,將admin管理后台的js和css等靜態文件拷貝到配置文件中的STATIC_ROOT目錄下。

  2.然后將STATICFILES_DIRS 列表中所有目錄下的內容也拷貝到STATIC_ROOT目錄下

python manage.py collectstatic在執行時,django默認會去查看定義在STATICFILES_DIRS里的目錄,以及在INSTALLED_APPS里定義了的app的static目錄。如果這些目錄下有文件,則把文件全部收集起來,拷貝到STATIC_ROOT目錄下。

 

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;
    }
    # 在nginx中要單獨做訪問/static/目錄的路由
    location /static {  
        expires 30d;
        autoindex on;
        add_header Cache-Control private;
        alias /usr/share/nginx/django_pro01/static/;
     }
 }

所有靜態文件都應該從“/usr/share/nginx/django_pro01/static/”這個目錄中(也就是上面定義的STATIC_ROOT)獲取。

 

 

 

 

參考:

https://www.cnblogs.com/shengulong/p/10322055.html

https://www.jianshu.com/p/a90680de19fb


免責聲明!

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



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