(r'^css/(?P<path>.*)$', 'django.views.static.serve', {'document_root': '/var/www/django-demo/css'}),
(r'^js/(?P</path><path>.*)$', 'django.views.static.serve', {'document_root': '/var/www/django-demo/js'}),
(r'^images/(?P</path><path>.*)$', 'django.views.static.serve', {'document_root': '/var/www/django-demo/images'}),
模板中使用下述方式即可:
<link href="/css/demo.css" type="text/css" rel="stylesheet">
注:可采用os.path.dirname(globals()["__file__"])来获得当前文件所在路径,比如
(r'^css/(?P<path>.*)$', 'django.views.static.serve', {'document_root': os.path.dirname(globals()["__file__"])+'/css'}),
可以使用os.path.abspath()函数返回此路径的绝对路径。
==============
要在django的tempalte file中引用css、js、gif等静态文件,首先一条setting.py中DEBUG开关打开。
1、在project目录下建立一个存放静态文件的目录,如:medias
2、在url.py patterns中增加一行:
(r'^site_media/(?P<path>.*)$','django.views.static.serve',{'document_root':settings.STATIC_PATH}),
还要from django.conf import setting
3、在setting.py中加入一行:
STATIC_PATH='./medias'
如此设置后,就可以在template file 中引用media中存放的静态文件了,如:
<img src='/site_media/django.gif'>
url的一些应用:
settings.py
ROOT = os.path.abspath(os.path.dirname(__file__))
STATIC_JS = os.path.join(ROOT, 'public', 'js')
STATIC_CSS = os.path.join(ROOT, 'public', 'css')
url.py
from django.conf import settings
url(r'^$', include('ad.application.controllers.urls')), #包含其他url conf
url(r'^(?i)js/(?P<path>.*)$', 'django.views.static.serve',{'document_root': settings.STATIC_JS}),
url(r'^(?i)css/(?P<path>.*)$', 'django.views.static.serve',{'document_root': settings.STATIC_CSS}),
template file
<script type="text/javascript" src="/js/jquery.js"></script>
指定url root
首先在settings.py中增加了一个配置项:URLROOT=”。这里我设为空,在真正部署时要改为实际的前缀,如’/platform’。注意后面不要有’/',因为原来的程序都是从’/'开始的,因此不需要最后的’/'。对于view中的url修改比较简单,首先写一个helper函数,用来从settings.py中读配置项:
from django.conf import settings
def setting(name, defaultvalue=”):
return getattr(settings, name, defaultvalue)
然后在需要修改URL的地方加上:
setting(‘URLROOT’) + ‘/login/’
这样就可以了。
对于template的修改分为三种情况。对于静态文件的URL,不用修改,继续使用如/site_media/img/xxx 这样的URL,因为可以通过配置web server的URL映射规则来进行处理,所以不用修改。那么要修改就是针对于动态的View方法的URL,有相对路径的和绝对路径的。为了可以在template中使用settings信息,可以通过设置TEMPLATE_CONTEXT_PROCESSORS来增加一个ContextProcessor的处理函数将settings对象导入,如:
TEMPLATE_CONTEXT_PROCESSORS = (
‘django.core.context_processors.auth’,
‘django.core.context_processors.debug’,
‘django.core.context_processors.i18n’,
‘django.core.context_processors.request’,
‘utils.setting_process.settings’,
)
然后编写一个简单的ContextProcessor的函数:
from django.conf import settings as _settings
def settings(request):
return {’settings’: _settings}
这样就可以在template中使用settings对象了。
对于绝对路径,在绝对路径前加上:{{ settings.URLROOT }}/login/ 就可以了。对于相对路径则可以不作修改。
经过上面的修改,当部署应用时有前缀,只要把 settings.py 中的URLROOT 修改一下就可以了。
不过上述只是考虑了整个应用有前缀的情况,并没有考虑某个App功能的前缀变化的问题。在woodlog项目中其实是考虑了这一点。它把所以App的前缀都放在settings.py进行配置了,如:
APP_ROOT = {’blog’:'blog’, ’setting’:’setting’, ‘tags’:'tags’, ‘digest’:'digest’, ‘rss’:'rss’}
这样在处理view和template时还要考虑URL是哪个app的,然后从settings.py中得到相应的配置值。不过这里比较简单,就没有考虑。