Django 处理静态文件
基础
作为基础,首先当然是要修改settings.py中的设置,主要是要修改以下内容
import os, socketBASE_DIR = os.path.dirname(os.path.dirname(__file__))# many many other settings# 静态文件在生产环境中的存储位置STATIC_ROOT = '/var/www/yoursite/static/'# 静态文件的URLSTATIC_URL = '/static/'# Django 应该在哪些位置寻找静态文件STATICFILES_DIRS = ( os.path.join(BASE_DIR, "static"),)# 静态文件收集引擎,如果静态文件与Django在同一台服务器上,则不用设置# 此时将使用默认引擎将静态文件收集到STATIC_ROOT中STATIC_STORAGE = 'django.contrib.staticfiles.storage.StaticFilesStorage'
然后确认在settings.py中的INSTALLED_APPS
中有配置项
'django.contrib.staticfiles',
那如何在模版中使用这些静态文件呢?参考如下代码,其中语句{% load static from staticfiles %}
在这个模版文件中只需要出现一次。
{% load static from staticfiles %}
用下边的方法也可
{% load static from staticfiles %}{% static "css/sample.css" as sample %}
Django在运行时会自动将这些文件映射到STATIC_URL
所给定的值下。也就是如,如果STATIC_URL = '/static/'
,那么在运行时,上边模版中的样例中的url会被替换为/static/css/sample.css
。
注1:其实将静态文件路径硬编码在模版中也可以正常运行,如使用href="/static/css/sample.css"
,前提是配置好了STATIC_URL
和STATIC_DIRS
。但并不推荐这么做,因为如果后来静态资源的位置发生了迁移,如使用独立服务器或者使用CDN,就要修改一大堆URL。而使用推荐的方法可以避免这个庞大的工作量,最多只需要修改STATIC_URL
即可。
注2:如果css文件中也使用了静态文件如css背景,则按照相对路径使用即可,因为浏览器解析css是会自动按照相对路径寻找到正确的URL。
使用Django所在服务器提供静态文件
在开发阶段,Django使用的是内建的一个静态文件服务器,虽然在生产环境中也可以使用,但是它既不稳定也不安全。更好的方式是使用提供web服务的服务器如apache来服务静态文件。
首先上传代码到服务器,然后运行collectstatic命令
# python manage.py collectstatic
然后配置web服务器来为静态文件服务,如对Apache2进行配置
Alias /robots.txt /var/www/mysite/static/robots.txtAlias /favicon.ico /var/www/mysite/static/favicon.icoAlias /media/ /var/www/mysite/media/Alias /static/ /var/www/mysite/static/Require all granted Require all granted WSGIScriptAlias / /var/www/mysite/mysite/wsgi.pyWSGIPythonPath /var/www/mysiteRequire all granted
注意:如果使用的是2.4以前的Apache版本,那么需要将Require all granted
修改如下,且注意deny
和allow
之间没有空格!!!
Order deny,allowAllow from all
在专用的服务器上提供静态文件
与上边基本相同,由于是另一台机器,因此可以使用其他的web服务器如nginx等。
首先上传代码到Django所在的服务器并执行collectstatic命令,将静态文件收集到Django所在服务器上的目录STATIC_ROOT
中,然后拷贝这些静态文件到专用服务器上,配置专用服务器使其能够提供静态文件服务。可以考虑使用来进行拷贝,因为它仅仅会传输发生改动的那些字节。
另外,因为静态文件迁移到了另一台服务器上,所以可能需要修正STATIC_URL
,同时重新配置web服务器。
当然,这个过车也可以使用脚本自动完成,如使用.
使用云存储服务或者CDN
如果使用云存储或者CDN,有两种方法可以提供静态文件。
第一种类似在专用的服务器上提供静态文件,只是才拷贝文件的时候是拷贝到相应的云服务或者CDN上。
第二种方法,如果第三方云存储服务或者CDN提供了API,可以动手实现一个静态文件收集引擎,那么运行collectstatic命令时会自动将静态文件收集到第三方存储中,过程也就变得更简单。