我最近在琢磨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
但愿本文对你们有所帮助!
笔者也只是一名学生,若是出错了,欢迎指正,也欢迎与我讨论!