本文目的
最近用django开发项目,发现django的静态文件(js,css和img等)配置比较麻烦,开发环境和生产环境的配置还不一样,这里记录一下,作为备忘。我当前使用的版本是django v1.4.3。
吐槽:django的版本不兼容是个大问题,网上搜索相关问题时,解决方案到是一大推,但是均没有标注版本,导致均不能适用当前版本,走了不少弯路。
开发环境配置
需要下面几个步骤
1. 在app目录下创建static目录,将静态文件和相关文件夹放到此目录下,如your_app/static/img等
2. 确保settings.py中的INSTALLED_APPS中包含django.contrib.staticfiles
3. 设置settings.py中的STATIC_URL的值为“/static/”
4. 在模版中使用{{ STATIC_URL }}作为静态文件路径前缀。比如纯在图片文件your_app/static/img/logo.png,那么应用代码为<img src=”{{ STATIC_URL }}img/logo.png”>
5. 渲染模版的Context对象需要换成RequestContext,否则模版中无法引用到STATIC_URL对应的值。
上面的操作步骤参见官方文档:https://docs.djangoproject.com/en/dev/howto/static-files/
特别注意:按照上述设置,settings.py中的DEBUG选项必须设置为True,否则'/static/'无法映射到静态文件目录。参见这里:http://stackoverflow.com/a/4566907/1114397
生产环境配置
我的发布环境是apache,这里只介绍相关配置。
使用apache的静态发布配置,而不使用django的配置,这也是django推荐的方式,因为django认为静态文件配置的方法交给服务器,会更有效。你所需要做的就是在apahce的配置文件中添加一个alice,如下
Alias /static "/your_wsgi/your_app/static"
# 注意结尾都没有斜杠,全路径也没有。
# 如果alias后面的值有反斜杠结尾,那么全路径也需要有,保持一致
“/static”对应django settings.py中配置的STATIC_URL的值。然后添加directory选项,配置相关目录的权限。Apache 2.4版本开始,对directory配置做出了调整,所以这里需要注意,如下:
Apache v2.4及以上版本,
<Directory "/your_wsgi/your_app/static ">
Require all granted
</Directory>
Apache v2.4以下版本
<Directory "/your_wsgi/your_app/static ">
Options Indexes FollowSymLinks
Order allow,deny
Allow from alli
</Directory>
注意上面红色部分。
Tips:如果访问静态图片遇到403错误,此时说明路径配置成功,离成功不远了。只是路径权限没有配置正确,这时可以看看apahce错误日志,如果出现“client denied by server configuration”,说明是directory的权限没有配置正确,可以查看自己的apache版本,然后做出响应配置。
希望本文对你有用!
最近在学习django框架的使用,想引用静态css文件,怎么都引用不到,从网搜了好多,大多因为版本问题,
和我现在的使用的dango1.1配置不同,根据资料和公司的项目最终解决,于是想整理总结下各版dango静态文件的配置,以备后查;
配置原因:由于django不处理静态文件(css、js、image等),而是交与web服务器处理。
而django的路径处理和其他web框架有些区别,它需要我们手动的配置静态文件的路径,而不能直接引用。
静态文件的配置的分两种:
第一种为django的开发服务器的配置
第二种是生产服务器的nginx或apache的web服务配置
第一种,django的开发服务器的静态文件配置,根据django版本的不同,有着比较大的区别。
dango 1.1静态文件配置:
1、在项目目录中同settings目录建立static文件夹,其中存放 js 、css 、images文件,可再单独创建文件存放。
我的文件路径:
2、在settings中增加静态文件目录配置:
1
|
STATIC_PATH
=
os.path.join( os.path.dirname(__file__) ,
'static'
)
|
3、在url.py 中增加静态文件的路径 :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
# u静态文件
urlpatterns
+
=
patterns('',
#(r'^static/(?P<path>.*)$', 'django.views.static.serve',{'document_root': settings.STATIC_PATH}),
(r
'^images/(?P<path>.*)$'
,
'django.views.static.serve'
,
{
'document_root'
: os.path.join( settings.STATIC_PATH ,
'images'
) } ) ,
(r
'^css/(?P<path>.*)$'
,
'django.views.static.serve'
,
{
'document_root'
: os.path.join( settings.STATIC_PATH ,
'css'
) } ) ,
(r
'^js/(?P<path>.*)$'
,
'django.views.static.serve'
,
{
'document_root'
: os.path.join( settings.STATIC_PATH ,
'js'
) } ) ,
)
|
4、在模板中引用:
1
2
|
<
link
href
=
"/css/bootstrap.min.css"
rel
=
"stylesheet"
>
<
script
src
=
"/js/ie-emulation-modes-warning.js"
></
script
>
|
主要是路径的问题,其他路径应该也可应,比如url.py中的直接使用start/来作为url,以下均匹配,以验证:
1
2
3
4
5
6
7
|
# 匹配static 文件夹及子文件夹中的文件
(r
'^static/(?P<path>.*)$'
,
'django.views.static.serve'
,{
'document_root'
: settings.STATIC_PATH}),
# 匹配image中的文件
#(r'^images/(.*)$' , 'django.views.static.serve', {'document_root': os.path.join( settings.STATIC_PATH , 'images' ) } ) ,
# 配置css文件价中的文件及子文件夹中的文件
#(r'^css/(?P<path>.*)$' , 'django.views.static.serve', {'document_root': os.path.join( settings.STATIC_PATH , 'css' ) } ) ,
#(r'^js/(?P<path>.*)$' , 'django.views.static.serve', {'document_root': os.path.join( settings.STATIC_PATH , 'js' ) } ) ,
|
django 1.3 静态文件配置:
django1.3提供了django.contrib.staticfiles这个模块,方便使用静态文件,显示图片,使用css等。
默认情况下(如果没有修改STATICFILES_FINDERS的话),Django首先会在STATICFILES_DIRS配置的文件夹中寻找静态文件,然后再从每个app的static子目录下查找,并且返回找到的第一个文件。
settings中新增的配置,MEDIA_ROOT、 MEDIA_URL 、STATIC_ROOT 、STATIC_URL
MEDIA:指用户上传的文件,比如在Model里面的FileFIeld,ImageField上传的文件。如果你定义
MEDIA_ROOT=c:\temp\media,那么File=models.FileField(upload_to="abc/"),上传的文件就会被保存到c:\temp\media\abc。MEDIA_ROOT必须是本地路径的绝对路径。
MEDIA_URL是指从浏览器访问时的地址前缀。
STATIC_ROOT用于存放网站自己的js,css,图片
注意:不要把你项目的静态文件放到这个目录。这个目录只有在运行manage.py collectstatic时才会用到。 Don't put anything in this directory(STATIC_ROOT) yourself; store your static files in apps' "static/" subdirectories and in STATICFILES_DIRS.
STATIC_URL的含义与MEDIA_URL类似
参考步骤如下:
1、settings配置:
1
2
3
4
5
6
7
8
9
10
|
HERE
=
os.path.dirname(os.path.dirname(__file__)
MEDIA_ROOT
=
os.path.join( HERE ,
'media'
).replace(
'\\','
/
')
MEDIA_URL
=
'/media/'
STATIC_ROOT
=
os.path.join( HERE ,
'static'
).replace(
'\\','
/
')
STATIC_URL
=
'/static/'
ADMIN_MEDIA_ROOT
=
'/static/admin/'
STATICFILES_DIRS
=
(
os.path.join(HERE,
'app1/static/'
).replace(
'\\','
/
'),
os.path.join(HERE,
'app2/static/'
).replace(
'\\','
/
')
)
|
2、url的配置:
1
2
3
4
|
from
django.conf
import
settings
from
djagno.conf.urls.static
import
static
urlpatterns
+
=
static(settings.MEDIA_URL , document_root
=
settings.MEDIA_ROOT )
urlpatterns
+
=
static(settings.STATIC_URL, document_root
=
settings.STATIC_ROOT )
|
3、模板的引用:
1
2
3
|
{% load static %}
<
img
src
=
"{{ get_static_prefix }}images/1.jpg"
/>
<
link
href="{get_static_prefix}}css/truple.css />
|
具体配置,视情况而定,并不一定如此配置,仅供参考,待验证--todo;
django 1.3 往后的静态配置目录结构及方法变动比较小。
django1.4 静态配置:
url.py 增加:
1
2
3
|
## django 自动处理静态文件, 在模板框中可直接通过 static/ 引用
from
django.contrib.staticfiles.urls
import
staticfiles_urlpatterns
urlpatterns
+
=
staticfiles_urlpatterns()
|
setting.py 配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
BASEPATH
=
os.path.join( os.path.dirname( os.path.abspath(__file__) ) ,
'..'
)
MEDIA_ROOT
=
''
MEDIA_URL
=
''
STATIC_ROOT
=
os.path.join( BASEPATH,
'static'
)
STATIC_URL
=
'/static/'
STATICFILES_DIRS
=
(
# Put strings here, like "/home/html/static" or "C:/www/django/static".
# Always use forward slashes, even on Windows.
# Don't forget to use absolute paths, not relative paths.
)
STATICFILES_FINDERS
=
(
'django.contrib.staticfiles.finders.FileSystemFinder'
,
'django.contrib.staticfiles.finders.AppDirectoriesFinder'
,
#'django.contrib.staticfiles.finders.DefaultStorageFinder',
)
TEMPLATE_LOADERS
=
(
'django.template.loaders.filesystem.Loader'
,
'django.template.loaders.app_directories.Loader'
,
# 'django.template.loaders.eggs.Loader',
)
MIDDLEWARE_CLASSES
=
(
'django.middleware.common.CommonMiddleware'
,
'django.contrib.sessions.middleware.SessionMiddleware'
,
'django.middleware.csrf.CsrfViewMiddleware'
,
'django.contrib.auth.middleware.AuthenticationMiddleware'
,
'django.contrib.messages.middleware.MessageMiddleware'
,
# Uncomment the next line for simple clickjacking protection:
# 'django.middleware.clickjacking.XFrameOptionsMiddleware',
)
import
os
TEMPLATE_DIRS
=
(os.path.join(os.path.dirname(__file__),
'..'
,
'templates'
).replace(
'\\','
/
'),)
INSTALLED_APPS
=
(
'django.contrib.auth'
,
'django.contrib.contenttypes'
,
'django.contrib.sessions'
,
'django.contrib.sites'
,
'django.contrib.messages'
,
'django.contrib.staticfiles'
,
# Uncomment the next line to enable the admin:
# 'django.contrib.admin',
# Uncomment the next line to enable admin documentation:
# 'django.contrib.admindocs',
'myapp'
,
)
# A sample logging configuration. The only tangible logging
# performed by this configuration is to send an email to
# the site admins on every HTTP 500 error when DEBUG=False.
# See http://docs.djangoproject.com/en/dev/topics/logging for
# more details on how to customize your logging configuration.
LOGGING
=
{
'version'
:
1
,
'disable_existing_loggers'
:
False
,
'filters'
: {
'require_debug_false'
: {
'()'
:
'django.utils.log.RequireDebugFalse'
}
},
'handlers'
: {
'mail_admins'
: {
'level'
:
'ERROR'
,
'filters'
: [
'require_debug_false'
],
'class'
:
'django.utils.log.AdminEmailHandler'
}
},
'loggers'
: {
'django.request'
: {
'handlers'
: [
'mail_admins'
],
'level'
:
'ERROR'
,
'propagate'
:
True
,
},
}
}
|
模板文件:
1
2
|
<
link
rel
=
"stylesheet"
href
=
"static/css/my.css"
>
<
script
src
=
"static/js/jquery.js"
></
script
>
|
待总结--todo
第二种 生成服务器的配置:
nignx的静态文件的配置:
todo
Apache的静态文件的配置:
todo
参考文档:
http://blog.sina.com.cn/s/blog_3fe961ae01016fpk.html
http://ddtcms.com/news/2011/11/21/18/django-1-3-zhong-xian-shi-tu-pian-shi-yong-jing-tai-wen-jian-de-wen-ti-django-static-files/
http://blog.csdn.net/wenxuansoft/article/details/8580508