我最近在琢磨django框架的使用,在上傳我的網站服務器上時,再次遇到了找不到靜態文件,css、img等樣式全無的問題。因而沉下心來,好好研究了django的靜態文件到底應該怎麼去部署(deploy),一點心得體會現分享於下。php
python manage.py collectstatic
作了什麼Collects the static files into STATIC_ROOT.
翻譯:把靜態文件收集到 STATIC_ROOT中。css
以上是官方文檔中的簡述。html
固然你確定會問,從哪裏收集這些靜態文件呢?python
在回答這個問題前,咱們先看一眼本身項目中的setting.py
文件:nginx
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
目錄下。[18.10.19二次編輯:當使用django
的runserver
時,若是請求的是一個靜態文件,django也是會默認查看上述的ROOT、DIRS和static目錄。可是,在部署到服務器上時,此規則就不使用了。]shell
這樣說可能有點難懂,下面給出一個示例:django
首先,如下是個人項目樹形圖,多餘文件在此已被省略。bash
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目錄,均符合靜態文件的查找規則。app
不難預想到,在執行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果真方便呀!咱們之後很輕鬆就能把靜態文件都收集到一塊兒啦!
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
但願本文對你們有所幫助!
筆者也只是一名學生,若是出錯了,歡迎指正,也歡迎與我討論!