前言

我最近在琢磨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二次编辑:当使用djangorunserver时,如果请求的是一个静态文件,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.txtmysite_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服务器的配置文件中定义/staticalias

此外,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

总结

希望本文对大家有所帮助!

笔者也只是一名学生,如果出错了,欢迎指正,也欢迎与我讨论!

django中collectstatic的使用的更多相关文章

  1. Django 中bootstrap的引用

    bootstrap的优越性 如果你有基本的HTML+CSS,bootstrap其实就是在标签中加入具体的class来实现样式.和原生态的HTML+CSS需要先在head标签的style写样式或者引入外 ...

  2. 异步任务队列Celery在Django中的使用

    前段时间在Django Web平台开发中,碰到一些请求执行的任务时间较长(几分钟),为了加快用户的响应时间,因此决定采用异步任务的方式在后台执行这些任务.在同事的指引下接触了Celery这个异步任务队 ...

  3. Mysql事务探索及其在Django中的实践(二)

    继上一篇<Mysql事务探索及其在Django中的实践(一)>交代完问题的背景和Mysql事务基础后,这一篇主要想介绍一下事务在Django中的使用以及实际应用给我们带来的效率提升. 首先 ...

  4. Mysql事务探索及其在Django中的实践(一)

    前言 很早就有想开始写博客的想法,一方面是对自己近期所学知识的一些总结.沉淀,方便以后对过去的知识进行梳理.追溯,一方面也希望能通过博客来认识更多相同技术圈的朋友.所幸近期通过了博客园的申请,那么今天 ...

  5. Django 中url补充以及模板继承

    Django中的URL补充 默认值 在url写路由关系的时候可以传递默认参数,如下: url(r'^index/', views.index,{"name":"root& ...

  6. django中css问题

    django中加载的css,js,图片其中js和图片可以加载出来,而css没有效果.原因如下: 这是因为你安装的某些IDE 或者其他更改了注册表导致的系统的注册表\HKEY_CLASSES_ROOT\ ...

  7. 在Django中进行注册用户的邮件确认

    之前利用Flask写博客时(http://hbnnlove.sinaapp.com),我对注册模块的逻辑设计很简单,就是用户填写注册表单,然后提交,数据库会更新User表中的数据,字段主要有用户名,哈 ...

  8. django中tinymce添加图片上传功能

    主要参考以下: https://pixabay.com/en/blog/posts/direct-image-uploads-in-tinymce-4-42/ http://blog.csdn.net ...

  9. django中migration文件是干啥的

    昨天很蠢的问leader git push的时候会不会把本地的数据库文件上传上去,意思是django中那些migration文件修改之后会不会上传. 然后得知不会,因为所有的数据库都存在本机的mysq ...

随机推荐

  1. C#判断网络链接状态

    using System.Net.NetworkInformation; bool isLocalAreaConnected = NetworkInterface.GetIsNetworkAvaila ...

  2. 3D Computer Grapihcs Using OpenGL - 09 Enable Depth Test

    启用Depth Test OpenGL是个3D绘图API,也就是说不只有xy坐标轴,还有第三个坐标轴z,z轴的方向是垂直于屏幕,指向屏幕内. 靠近人眼的方向是负方向,标准化设备坐标的最小值是-1, 最 ...

  3. 4.16中Montage的一些变化

    用4.16版本跟着网上的几篇Montage教程(分别是对应4.6和4.8版本)做,遇到各种各样的问题,经过各种搜索和分析,最终终于搞定了. 4.16版的Montage和之前有了不小的变化,总结如下: ...

  4. Spring Cloud Commons教程(一)普通抽象

    诸如服务发现,负载平衡和断路器之类的模式适用于所有Spring Cloud客户端可以独立于实现(例如通过Eureka或Consul发现)的消耗的共同抽象层. @EnableDiscoveryClien ...

  5. 在 mac 系统上安装 python 的 MySQLdb 模块

    在 mac 系统上安装 python 的 MySQLdb 模块 特别说明:本文主要参考了Mac系统怎么安装MySQLdb(MySQL-Python) 第 1 步:下载 MySQL-python-1.2 ...

  6. 移动端续讲及zepto移动端插件外加touch插件介绍

    媒体查询:针对不同设备,显示不同的样式. 设备像素比:dpr  device-piexl-ratio 在he开发中,要一个3陪高清图片: 1080>=320*3 (主要是为了解决图片的失真问题) ...

  7. 修改 video.js 默认 bufferTime

    1.自建rtmp推流.转发.播放,前端用video.js 发现总延时在2秒多,服务器已优化,看看video.js能否优化 2.引用:在RTMP播放器侧,很重要的一点是:在  NetStream.set ...

  8. Linux内核调试方法总结之Jprobes

    Jprobes [用途] 类似于Kprobes和Return Probes,区别在于,Kprobes可以在任意指令处插入探针,Jprobes只在函数入口插入探针,而Return Probes则是在函数 ...

  9. MySQL高可用方案 MHA之二 master_ip_failover

    异步主从复制架构master:10.150.20.90 ed3jrdba90slave:10.15.20.97 ed3jrdba9710.150.20.132 ed3jrdba132manager:1 ...

  10. 状压dp(8.8上午)

    神马是状态压缩? 就是当普通dp的每一维表示的状态非常少的时候,可以压缩成一维来表示 如果m==8 dp[i][0/1][0/1]......[0/1] 压缩一下 dp[i][s]表示到了第i行,状态 ...