django中collectstatic的使用(亲测)

  • Post author:
  • Post category:其他


前言

我最近在琢磨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