django 静态资源配置详解
2015-10-14 23:50
639 查看
学习了django1.8的Managing static files一章,自己动手实验之后仍遇到几个问题,通过阅读saticfiles模块部分的源码终于理解了当中奥妙。
1. 确保INSTALLED_APPS安装了django.contrib.staticfiles模块
2. 定义STATIC_URL:如
3. 在模板中访问可以有三种方式:直接硬编码像/static/×××.jpg这样,或是使用static标签,如
4. 在/static/目录下存放静态文件。
总结起来,基本配置就是这四点。
但是,其中有个问题,/static/指定的是哪个目录。
静态资源将利用STATICFILES_FINDERS指定的搜索器搜索路径下面的STATIC_URL指定目录。STATICFILES_FINDERS默认依次包含:
FileSystemFinder:在文件系统里搜索STATICFILES_DIRS指定目录。默认不包含任何目录
AppDirectoriesFinder:搜索INSTALLED_APPS注册过的应用目录
因此,使用入门级配置的正常情况下就是在project注册app,然后在app目录下存放static目录。
下面情况无法访问静态资源
资源存放在project下的static目录,没有在settings.py中设置STATICFILES_DIRS为(os.path.join(BASE_DIR, “static”)
static(prefix, view=serve, ××kwargs)会返回一个Url,该url会由django.views.static.serve进行响应。serve方法纯粹使用文件系统来搜索资源文件。STATIC_URL作为访问url里资源的前缀,STATIC_ROOT必须是资源文件的绝对文件路径。举例如下:
访问时http://localhost:8000/statics/*.img。代码会查找statics资源前缀,截取后面的路径如*.img再与STATIC_ROOT路径拼接,进而访问资源文件。
应学会灵活使用static(prefix, view=serve, ××kwargs),上面使用了STATIC_URL和STATIC_ROOT,但要意识到只要参数正确,传什么都可以。这种静态资源的使用方式简单粗暴,即使不是开发环境也能适用哦。唯一缺点不适合商用。
生产环境就是利用专门的静态文件服务器提供服务。
将你的代码推送到部署的服务器上。
在这台服务器上,运行collectstatic 来收集所有的静态文件到STATIC_ROOT。
配置Web服务器来托管URL STATIC_URL下的STATIC_ROOT。 例如,参考使用Apache 和mod_wsgi 来完成它
想自动化这个过程,特别是有多台Web 服务器。有许多种方法来完成这个自动化,但是许多Django 开发人员喜欢 Fabric。
一个部署静态文件来多台Web 服务器上的Fabric 脚本大概会是:
下面是Fabric 脚本大概的样子:
to be continue…
开发环境的入门配置
开发环境即设DEBUG=True1. 确保INSTALLED_APPS安装了django.contrib.staticfiles模块
2. 定义STATIC_URL:如
STATIC_URL = '/static/'
3. 在模板中访问可以有三种方式:直接硬编码像/static/×××.jpg这样,或是使用static标签,如
{% load staticfiles %} <img src="{% static "my_app/myexample.jpg" %}" alt="My image"/>,我常使用{{STATIC_URL}}×××.jpg 来写静态路径的(必须使用RequestContext进行渲染,否则无法引用STATIC_URL的值)。
4. 在/static/目录下存放静态文件。
总结起来,基本配置就是这四点。
但是,其中有个问题,/static/指定的是哪个目录。
静态资源将利用STATICFILES_FINDERS指定的搜索器搜索路径下面的STATIC_URL指定目录。STATICFILES_FINDERS默认依次包含:
FileSystemFinder:在文件系统里搜索STATICFILES_DIRS指定目录。默认不包含任何目录
AppDirectoriesFinder:搜索INSTALLED_APPS注册过的应用目录
因此,使用入门级配置的正常情况下就是在project注册app,然后在app目录下存放static目录。
下面情况无法访问静态资源
资源存放在project下的static目录,没有在settings.py中设置STATICFILES_DIRS为(os.path.join(BASE_DIR, “static”)
静态资源的高级配置
不使用django.contrib.staticfiles模块时,可以利用django.views.static.serve提供静态资源。用法简单,只要在urls.py使用下面的代码:from django.conf import settings from django.conf.urls.static import static urlpatterns = [ # ... the rest of your URLconf goes here ... ] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
static(prefix, view=serve, ××kwargs)会返回一个Url,该url会由django.views.static.serve进行响应。serve方法纯粹使用文件系统来搜索资源文件。STATIC_URL作为访问url里资源的前缀,STATIC_ROOT必须是资源文件的绝对文件路径。举例如下:
STATIC_ROOT='/home/user/MySite/static/' STATIC_URL=statics
访问时http://localhost:8000/statics/*.img。代码会查找statics资源前缀,截取后面的路径如*.img再与STATIC_ROOT路径拼接,进而访问资源文件。
应学会灵活使用static(prefix, view=serve, ××kwargs),上面使用了STATIC_URL和STATIC_ROOT,但要意识到只要参数正确,传什么都可以。这种静态资源的使用方式简单粗暴,即使不是开发环境也能适用哦。唯一缺点不适合商用。
生产环境的静态资源部署
先介绍下运行python manage.py collectstatic命令,配合STATIC_ROOT,会自动将各个app下的静态文件集中到STATIC_ROOT目录下。
生产环境就是利用专门的静态文件服务器提供服务。
网站和静态文件位于同一台服务器上
如果你的静态文件和网站位于同一台服务器,流程可能像是这样:将你的代码推送到部署的服务器上。
在这台服务器上,运行collectstatic 来收集所有的静态文件到STATIC_ROOT。
配置Web服务器来托管URL STATIC_URL下的STATIC_ROOT。 例如,参考使用Apache 和mod_wsgi 来完成它
想自动化这个过程,特别是有多台Web 服务器。有许多种方法来完成这个自动化,但是许多Django 开发人员喜欢 Fabric。
一个部署静态文件来多台Web 服务器上的Fabric 脚本大概会是:
from fabric.api import * # Hosts to deploy onto env.hosts = ['www1.example.com', 'www2.example.com'] # Where your project code lives on the server env.project_root = '/home/www/myproject' def deploy_static(): with cd(env.project_root): run('./manage.py collectstatic -v0 --noinput')
静态文件位于一台专门的服务器上
运行collectstatic 来收集所有的静态文件到STATIC_ROOT。利用rsync ,传输静态文件改变的部分到各服务器。下面是Fabric 脚本大概的样子:
from fabric.api import * from fabric.contrib import project # Where the static files get collected locally. Your STATIC_ROOT setting. env.local_static_root = '/tmp/static' # Where the static files should go remotely env.remote_static_root = '/home/www/static.example.com' @roles('static') def deploy_static(): local('./manage.py collectstatic') project.rsync_project( remote_dir = env.remote_static_root, local_dir = env.local_static_root, delete = True )
静态文件位于一个云服务或CDN上
使用自定义文件存储后端to be continue…
相关文章推荐
- django中使用jquery ajax post数据出现403错误的解决办法(两种方法)
- django使用ajax post数据出现403错误如何解决
- windows+apache+mod_python配置django运行环境
- python Django连接MySQL数据库做增删改查
- django自定义Field实现一个字段存储以逗号分隔的字符串
- 在Python的Django框架中加载模版的方法
- 在Django中使用Sitemap的方法讲解
- 详解Django中的form库的使用
- Django中的CACHE_BACKEND参数和站点级Cache设置
- 剖析Django中模版标签的解析与参数传递
- Python中DJANGO简单测试实例
- Python的Django框架中的数据库配置指南
- 在Django的上下文中设置变量的方法
- 在Python的Django框架中编写编译函数
- 在Django的URLconf中进行函数导入的方法
- 在Python的Django框架中生成CSV文件的方法
- 在主机商的共享服务器上部署Django站点的方法
- 使用Python的Django框架中的压缩组件Django Compressor
- 对于Python的Django框架部署的一些建议
- Djang中静态文件配置方法