为什么要管理静态文件
Django官方教程说:
We recommend using a separate Web server – i.e., one that’s not also running Django – for serving media.
即建议用个额外的web服务器处理静态文件。实际部署过程中,常用Nginx作为反向代理服务器以及静态文件服务器。
对于静态文件的处理很麻烦,因为在开发模式和实际部署时还会有区别。很多教程上来就是怎么做,而不说为什么要那样做。
那么,到底为什么呢?
在Stack Overflow上找到的答案是:为了效率:
- 把静态文件放到另一个服务器,甚至另一个域/子域,能大幅优化对它们的处理(比如用Nginx)
- 能减少网络阻塞。如果静态文件和动态应用在同一个域内,浏览器访问静态文件时,就会把域的cookies也放到请求里,其实是没必要的;如果静态文件在另一个域内,该域就可以配置为无需cookies的域(cookieless domain)。
接下来问题又来了,为什么小小的cookies会这么影响效率呢?因为网络访问过程中,上传和下载是不对等的,至少是1:10,且一般只对下载做压缩,对上传不做。所以谷歌说了:
The best way to cut down on client request time is to reduce the number of bytes uploaded as request header data. So, minimize request size and serve static content from a cookieless domain. – developers.google.com
详见:Why you need a cookie-less domain
Django开发环境静态文件管理
开发模式下,有两种方法:使用 django.contrib.staticfiles
自动管理,或手工配置。
使用 django.contrib.staticfiles 自动管理
Django提供了django.contrib.staticfiles
app来管理静态文件。
在开发环境下,如果使用了django.contrib.staticfiles
,且Debug
为True
时,runserver
命令会自动处理静态文件。但这种方式效率极低,且不安全。
配置某个app使用的静态文件
- 在
settings.py
中,将其加入 INSTALLED_APPS
:
- 在
settings.py
中,加入:
STATIC_URL = '/static/'
- 在模板中用
static
标签处理相对路径:
{% load static %}
<img src="{% static 'my_app/example.jpg' %}" alt="My image">
- 将静态文件存储到app目录下的
static
文件夹:
my_app/static/my_app/example.jpg
配置多app共用的静态文件
如果有些静态文件并非某app独用,比如有个logo,想让多个app共享使用,可在settings.py
中定义:
STATICFILES_DIRS = [
BASE_DIR / "static",
'/var/www/static/',
]
Django就会在这些文件夹里寻找静态文件。
但除非是公共静态文件,最好别放到这些目录里。因为Django的STATICFILES_FINDERS
还会自动扫描所有INSTALLED_APPS
中叫static的子文件夹寻找静态文件,所以最好也用与app同名的命名空间区分,否则就无法区分同名静态文件,直接拿第一个匹配的使用。
手动管理静态文件
如果不用django.contrib.staticfiles
,可以使用django.views.static.serve()
视图来管理静态文件。
- 在
settings.py
中,加入:
STATIC_URL = '/static/'
- 在
urls.py
中,加入helper函数:
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
该helper函数仅在debug模式下,且前缀是本地路径(如/static/,而非http://static.example.com/)时生效。
并且它只处理STATIC_ROOT
文件夹,不会像django.contrib.staticfiles.
那样去搜索app中的static文件夹。
STATIC_ROOT
表示collectstatic
命令会将静态文件采集到的目的地绝对路径(django.contrib.staticfiles
app负责采集)。
处理用户上传的静态文件
使用 django.views.static.serve()
视图,通过指定MEDIA_ROOT
( 如/media/)来处理用户上传的文件:
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
该helper函数仅在debug模式下,且前缀是本地路径(如/media/,而非http://media.example.com/)时生效。
Django生产环境静态文件管理
在同一个服务器上部署
- 在服务器上运行
collectstatic
指令 - 设置服务器的静态文件配置为
STATIC_URL
下的STATIC_ROOT
在专门静态文件服务器上部署
- 静态文件发生变动时,在本地执行
collectstatic
- 将
STATIC_ROOT
目录的静态文件部署到静态文件服务器,通常用rsync文件同步工具
参考:rsync用法教程
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)