詳解django中的collectstatic命令以及STATIC_URL、STATIC_ROOT配置
前言
我最近在琢磨django框架的使用,在上傳個人網站伺服器上時,再次遇到了找不到靜態檔案,css、img等樣式全無的問題。於是沉下心來,好好研究了django的靜態檔案到底應該怎麼去部署(deploy),一點心得體會現分享於下。
1. python manage.py collectstatic
做了什麼
Collects the static files into STATIC_ROOT.
翻譯:把靜態檔案收集到 STATIC_ROOT中。
以上是官方文件中的簡述。
當然你肯定會問,從哪裡收集這些靜態檔案呢?
在回答這個問題前,我們先看一眼自己專案中的setting.py
檔案:
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "static/"),
]
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, "static_new/")
#其中STATIC_ROOT和STATICFILES_DIRS預設為None,
#即未設定,我是自己配置成這樣子的
python manage.py collectstatic
在執行時,django
預設會去檢視定義在STATICFILES_DIRS
裡的目錄,以及在INSTALLED_APPS
裡定義了的app的static
目錄。如果這些目錄下有檔案,則把檔案全部收集起來,拷貝到STATIC_ROOT
django
的runserver
時,如果請求的是一個靜態檔案,django也是會預設檢視上述的ROOT、DIRS和static目錄。但是,在部署到伺服器上時,此規則就不使用了。]
這樣說可能有點難懂,下面給出一個示例:
首先,以下是我的專案樹形圖,多餘檔案在此已被省略。
BASE_DIR
├── manage.py
├── polls
│ ├── static
│ │ ├── mystie_polls_static.txt
├── static
│ └── mysite_static.txt
注意:polls是我專案裡的一個app!且已經新增到了INSTALLED_APPS中!
可以看到,我的專案下有static/mysite_static.txt
以及polls/static/mystie_polls_static.txt
,前者目錄已經被寫在STATICFILES_DIRS
中,後者的目錄是app下的static目錄,均符合靜態檔案的查詢規則。
不難預想到,在執行collectstatic
後,mystie_polls_static.txt
和mysite_static.txt
檔案都會被收集到STATIC_ROOT
中。
#在專案目錄下執行
python manage.py collectstatic
最終專案檔案結構的樹狀圖如下:
├── manage.py
├── polls
│ ├── static
│ │ ├── mystie_polls_static.txt
├── static
│ └── mysite_static.txt
├── static_new
│ ├── *admin
│ ├── mysite_static.txt
│ └── mystie_polls_static.txt
#其中,admin是django自帶的後臺管理的靜態檔案
不出所料哈哈,django果然方便呀!我們以後很輕鬆就能把靜態檔案都收集到一起啦!
2. STATIC_URL
的作用
URL to use when referring to static files located in STATIC_ROOT.
Example: “/static/” or “http://www.example.com/static/”
翻譯:STATIC_URL用於引用STATIC_ROOT所指向的靜態檔案。
舉個栗子,在python manage.py runserver
後,我能夠以http://localhost:8000/static/mystie_polls_static.txt為路徑,訪問到STATIC_ROOT下的靜態檔案。
但是,如果你使用了nginx
(或其他)伺服器後,該規則就無效了。伺服器會接管URL
匹配規則,你需要在nginx伺服器的配置檔案中定義/static
的alias
。
此外,STATIC_URL
還有一個作用,如下:
假定你的設定檔案中有
STATIC_URL = '/static/'
那麼,在templates
中,你可以通過模板標籤static和給定的相對路徑來構成一個URL,如下。
{% load static %}
<img src="{% static "my_app/example.jpg" %}" alt="My image">
此時,構成的URL為my_app/static/my_app/example.jpg
。
如果你在專案中用到了
static
這個模板標籤,那一定要將nginx(或其他)伺服器的/static
配置到與STATIC_ROOT一致!
依我愚見,這樣做是有好處的。因為django不像php,只要將靜態檔案放置在.php
或者.html
同一目錄下就好。
比如:<link rel="stylesheet" type="text/css" href="static/css/main.css">
,在django中挪進一個資料夾中就可能訪問不到了。
這個時候static
標籤就非常有用了;當然你也可以在uwsgi的配置中通過--check-static
和--static-map mountpoint=path
來解決這個問題。官方連結在此:https://uwsgi-docs.readthedocs.io/en/latest/StaticFiles.html
總結
希望本文對大家有所幫助!
筆者也只是一名學生,如果出錯了,歡迎指正,也歡迎與我討論!