Django对静态文件的处理


原文请移步

Django 处理静态文件

基础

作为基础,首先当然是要修改settings.py中的设置,主要是要修改以下内容

import os, socket
BASE_DIR = os.path.dirname(os.path.dirname(__file__))

# many many other settings

# 静态文件在生产环境中的存储位置
STATIC_ROOT = '/var/www/yoursite/static/'

# 静态文件的URL
STATIC_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 %}
<link href="{% static "css/sample.css" %}" rel="stylesheet">

用下边的方法也可

{% load static from staticfiles %}
{% static "css/sample.css" as sample %}
<link href="{{ sample }}" rel="stylesheet">

Django在运行时会自动将这些文件映射到STATIC_URL所给定的值下。也就是如,如果STATIC_URL = '/static/',那么在运行时,上边模版中的样例中的url会被替换为/static/css/sample.css

注1:其实将静态文件路径硬编码在模版中也可以正常运行,如使用href="/static/css/sample.css",前提是配置好了STATIC_URLSTATIC_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.txt
Alias /favicon.ico /var/www/mysite/static/favicon.ico

Alias /media/ /var/www/mysite/media/
Alias /static/ /var/www/mysite/static/

<Directory /var/www/mysite/static>
Require all granted
</Directory>

<Directory /var/www/mysite/media>
Require all granted
</Directory>

WSGIScriptAlias / /var/www/mysite/mysite/wsgi.py
WSGIPythonPath /var/www/mysite

<Directory /var/www/mysite/mysite>
<Files wsgi.py>
Require all granted
</Files>
</Directory>

注意:如果使用的是2.4以前的Apache版本,那么需要将Require all granted修改如下,且注意denyallow之间没有空格!!!

Order deny,allow
Allow from all

在专用的服务器上提供静态文件

与上边基本相同,由于是另一台机器,因此可以使用其他的web服务器如nginx等。

首先上传代码到Django所在的服务器并执行collectstatic命令,将静态文件收集到Django所在服务器上的目录STATIC_ROOT中,然后拷贝这些静态文件到专用服务器上,配置专用服务器使其能够提供静态文件服务。可以考虑使用rsync来进行拷贝,因为它仅仅会传输发生改动的那些字节。

另外,因为静态文件迁移到了另一台服务器上,所以可能需要修正STATIC_URL,同时重新配置web服务器。

当然,这个过车也可以使用脚本自动完成,如使用Fabric.

使用云存储服务或者CDN

如果使用云存储或者CDN,有两种方法可以提供静态文件。

第一种类似在专用的服务器上提供静态文件,只是才拷贝文件的时候是拷贝到相应的云服务或者CDN上。

第二种方法,如果第三方云存储服务或者CDN提供了API,可以动手实现一个静态文件收集引擎,那么运行collectstatic命令时会自动将静态文件收集到第三方存储中,过程也就变得更简单。

原文请移步

智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告