Django静态文件配置
本文目的
最近用django開(kāi)發(fā)項(xiàng)目,發(fā)現(xiàn)django的靜態(tài)文件(js,css和img等)配置比較麻煩,開(kāi)發(fā)環(huán)境和生產(chǎn)環(huán)境的配置還不一樣,這里記錄一下,作為備忘。我當(dāng)前使用的版本是django v1.4.3。
吐槽:django的版本不兼容是個(gè)大問(wèn)題,網(wǎng)上搜索相關(guān)問(wèn)題時(shí),解決方案到是一大推,但是均沒(méi)有標(biāo)注版本,導(dǎo)致均不能適用當(dāng)前版本,走了不少?gòu)澛贰?/span>
?
開(kāi)發(fā)環(huán)境配置
需要下面幾個(gè)步驟
1. 在app目錄下創(chuàng)建static目錄,將靜態(tài)文件和相關(guān)文件夾放到此目錄下,如your_app/static/img等
2. 確保settings.py中的INSTALLED_APPS中包含django.contrib.staticfiles
3. 設(shè)置settings.py中的STATIC_URL的值為“/static/”
4. 在模版中使用{{ STATIC_URL }}作為靜態(tài)文件路徑前綴。比如純?cè)趫D片文件your_app/static/img/logo.png,那么應(yīng)用代碼為<img src=”{{ STATIC_URL }}img/logo.png”>
5. 渲染模版的Context對(duì)象需要換成RequestContext,否則模版中無(wú)法引用到STATIC_URL對(duì)應(yīng)的值。
上面的操作步驟參見(jiàn)官方文檔:https://docs.djangoproject.com/en/dev/howto/static-files/
特別注意:按照上述設(shè)置,settings.py中的DEBUG選項(xiàng)必須設(shè)置為True,否則'/static/'無(wú)法映射到靜態(tài)文件目錄。參見(jiàn)這里:http://stackoverflow.com/a/4566907/1114397
?
?
生產(chǎn)環(huán)境配置
我的發(fā)布環(huán)境是apache,這里只介紹相關(guān)配置。
使用apache的靜態(tài)發(fā)布配置,而不使用django的配置,這也是django推薦的方式,因?yàn)閐jango認(rèn)為靜態(tài)文件配置的方法交給服務(wù)器,會(huì)更有效。你所需要做的就是在apahce的配置文件中添加一個(gè)alice,如下
Alias /static "/your_wsgi/your_app/static"
# 注意結(jié)尾都沒(méi)有斜杠,全路徑也沒(méi)有。
# 如果alias后面的值有反斜杠結(jié)尾,那么全路徑也需要有,保持一致
“/static”對(duì)應(yīng)django settings.py中配置的STATIC_URL的值。然后添加directory選項(xiàng),配置相關(guān)目錄的權(quán)限。Apache 2.4版本開(kāi)始,對(duì)directory配置做出了調(diào)整,所以這里需要注意,如下:
?
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:如果訪問(wèn)靜態(tài)圖片遇到403錯(cuò)誤,此時(shí)說(shuō)明路徑配置成功,離成功不遠(yuǎn)了。只是路徑權(quán)限沒(méi)有配置正確,這時(shí)可以看看apahce錯(cuò)誤日志,如果出現(xiàn)“client denied by server configuration”,說(shuō)明是directory的權(quán)限沒(méi)有配置正確,可以查看自己的apache版本,然后做出響應(yīng)配置。
?
希望本文對(duì)你有用!
最近在學(xué)習(xí)django框架的使用,想引用靜態(tài)css文件,怎么都引用不到,從網(wǎng)搜了好多,大多因?yàn)榘姹締?wèn)題,
和我現(xiàn)在的使用的dango1.1配置不同,根據(jù)資料和公司的項(xiàng)目最終解決,于是想整理總結(jié)下各版dango靜態(tài)文件的配置,以備后查;
配置原因:由于django不處理靜態(tài)文件(css、js、image等),而是交與web服務(wù)器處理。
而django的路徑處理和其他web框架有些區(qū)別,它需要我們手動(dòng)的配置靜態(tài)文件的路徑,而不能直接引用。
靜態(tài)文件的配置的分兩種:
??? 第一種為django的開(kāi)發(fā)服務(wù)器的配置
??? 第二種是生產(chǎn)服務(wù)器的nginx或apache的web服務(wù)配置
第一種,django的開(kāi)發(fā)服務(wù)器的靜態(tài)文件配置,根據(jù)django版本的不同,有著比較大的區(qū)別。
??? dango 1.1靜態(tài)文件配置:
??????? 1、在項(xiàng)目目錄中同settings目錄建立static文件夾,其中存放 js 、css 、images文件,可再單獨(dú)創(chuàng)建文件存放。
我的文件路徑:
??????? 2、在settings中增加靜態(tài)文件目錄配置:
?| 1 | STATIC_PATH?=?os.path.join(?os.path.dirname(__file__)?,?'static'?) |
??????? 3、在url.py 中增加靜態(tài)文件的路徑 :
?| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #?u靜態(tài)文件 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> |
主要是路徑的問(wèn)題,其他路徑應(yīng)該也可應(yīng),比如url.py中的直接使用start/來(lái)作為url,以下均匹配,以驗(yàn)證:
?| 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文件價(jià)中的文件及子文件夾中的文件 #(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 靜態(tài)文件配置:
????? django1.3提供了django.contrib.staticfiles這個(gè)模塊,方便使用靜態(tài)文件,顯示圖片,使用css等。
默認(rèn)情況下(如果沒(méi)有修改STATICFILES_FINDERS的話),Django首先會(huì)在STATICFILES_DIRS配置的文件夾中尋找靜態(tài)文件,然后再?gòu)拿總€(gè)app的static子目錄下查找,并且返回找到的第一個(gè)文件。
settings中新增的配置,MEDIA_ROOT、 MEDIA_URL 、STATIC_ROOT? 、STATIC_URL
MEDIA:指用戶上傳的文件,比如在Model里面的FileFIeld,ImageField上傳的文件。如果你定義
MEDIA_ROOT=c:\temp\media,那么File=models.FileField(upload_to="abc/"),上傳的文件就會(huì)被保存到c:\temp\media\abc。MEDIA_ROOT必須是本地路徑的絕對(duì)路徑。
MEDIA_URL是指從瀏覽器訪問(wèn)時(shí)的地址前綴。
STATIC_ROOT用于存放網(wǎng)站自己的js,css,圖片
???注意:不要把你項(xiàng)目的靜態(tài)文件放到這個(gè)目錄。這個(gè)目錄只有在運(yùn)行manage.py collectstatic時(shí)才會(huì)用到。?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?/> |
具體配置,視情況而定,并不一定如此配置,僅供參考,待驗(yàn)證--todo;
django 1.3 往后的靜態(tài)配置目錄結(jié)構(gòu)及方法變動(dòng)比較小。
django1.4 靜態(tài)配置:
url.py 增加:
?| 1 2 3 | ##?django?自動(dòng)處理靜態(tài)文件,?在模板框中可直接通過(guò)?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> |
待總結(jié)--todo
第二種 生成服務(wù)器的配置:
nignx的靜態(tài)文件的配置:
todo
Apache的靜態(tài)文件的配置:
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
總結(jié)
以上是生活随笔為你收集整理的Django静态文件配置的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Django1.6 用Form实现注册登
- 下一篇: Django中配置静态文件路径