django中collectstatic的使用(亲测)
前言
我最近在琢磨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目錄下。[18.10.19二次編輯:當使用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
總結
希望本文對大家有所幫助!
筆者也只是一名學生,如果出錯了,歡迎指正,也歡迎與我討論!
來源:https://www.cnblogs.com/baby12138/p/10834067.html
總結
以上是生活随笔為你收集整理的django中collectstatic的使用(亲测)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 油箱是什么材质?
- 下一篇: 自由侠原厂火花塞是铱金吗?