寫了幾周的腳本,今天終于開始接觸web框架了~學(xué)習(xí)Python的web框架,那么Django就幾乎是必修課了,這次的工作是先打打下手,主要的任務(wù)是在setting中添加版本號,在渲染靜態(tài)CSS,js的路徑時附帶版本號,例如“example.v1124.css”,然后再在request請求中祛除掉版本號。為什么要這么做呢?因為這樣做的話在前端輸出靜態(tài)文件的路徑就會加上就會加上版本號,這樣當(dāng)開發(fā)出新的靜態(tài)文件的時候,客戶端就會強制刷新本地的緩存,為了達到這個目的就要首先要在settings文件中配置,這樣就可以每次修改的時候直接從settings讀取版本號了,下面是大致的處理流程,各位自己感受一下吧~
好了,那么我們就開始一步步的完成吧~首先在settings文件中定義好一個版本號的變量。
#Static file version numberSTATIC_VERSION = 'v1124'
然后就是在你要使用版本號的app中的views文件中取到這個變量并賦值給需要渲染的模板中了。
#要想在settings文件中取到變量就要先導(dǎo)入模塊from django.conf import settings#在settings配置文件中取得靜態(tài)文件版本號version = settings.STATIC_VERSION#下面這個函數(shù)是例子.....def index(request): template = loader.get_template('base/base_index.html') #將取得的靜態(tài)文件版本號傳入到模板中 context = Context({'version':version}) return HttPResponse(template.render(context))
這樣就可以在HTML文件中這樣寫靜態(tài)文件路徑了。
<link rel="stylesheet" type="text/css" href="/youappname/static/css/css.{{version}}.css"><script language="javascript" type="text/Javascript" src="/youappname/static/js/script.{{version}}.js"></script>
到這一步,當(dāng)你打開瀏覽器后臺的時候你就會發(fā)現(xiàn)你的路徑就會改變了,但是這個時候當(dāng)你再刷新的時候就會出現(xiàn)靜態(tài)文件找不到的問題了,為什么會這樣呢?因為這個時候的瀏覽器會繼續(xù)按照新的路徑去請求靜態(tài)文件,但是你會發(fā)現(xiàn)你靜態(tài)文件的物理地址其實是沒有改變過的,所以這時候你請求的是新的地址,自然也就取不到了,那么我們該怎么辦呢?
下面就是我們的主角Middleware出場了!那什么是Middleware呢?文檔上說是中間件,可能不好理解,那么其實就是Javaweb框架中Struts2中的攔截器,無論是作用還是原理都是如出一轍的,那么這樣一等價的話就很好理解Django中的Middleware了,既然是攔截器那么能做的就不僅僅是過濾一個靜態(tài)文件版本號這么簡單咯,查看了文檔之后發(fā)現(xiàn)它還有很多很多實用的功能,那么都能哪些方法呢?
process_request 接受request之后確定所執(zhí)行的view之前
process_view 確定了所要執(zhí)行的view之后 view真正執(zhí)行之前
process_response view 執(zhí)行之后
process_exception(self, request, exception) view拋出異常
通過我們繼承實現(xiàn)上面的一個或者多個方法就可以實現(xiàn)我們想要的功能了,那么它的處理流程呢?自然也是和攔截器一樣了。
為什么要注意這個處理流程呢?因為這個流程會影響我們在settings文件中配置我們自己的Middleware順序,其實在settings文件中我們的配置順序就是它執(zhí)行的順序了,那么說到底該如何安裝Middleware呢?
首先我們先要在settings文件中配置好我們的Middleware文件路徑
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', #下面的這個地址就是我們自己的中間件文件了 'youappname.pyname.calssname',)這樣我們就已經(jīng)安裝好了自己的中間件了,那下面就可以攔截下所有的request請求了,現(xiàn)在我們該在中間件中處理我們的業(yè)務(wù)邏輯了
#coding=utf-8import urllib,pdb,refrom django.template import RequestContextfrom django.shortcuts import render_to_responseclass middlewareVersion(object): def process_request(self, request): #判斷如果url請求中有今天文件的請求,那么就攔截下來 if request.path_info.startswith('/youappname/static/'): #得到path路徑,使用正則表達式將版本號過濾掉 request.path_info = re.sub(r'/.v/d+','',request.path_info)
因為我的版本號是以v開頭,后面是數(shù)字,所以用正則將這樣的字符串替換成空。
現(xiàn)在按照之前流程圖里面的我們是不是就完成了呢?顯然不是嘛~僅僅這樣做的話你會發(fā)現(xiàn)你的Middleware并沒有起作用,我們用pdb斷點調(diào)試發(fā)現(xiàn),其實我們并沒有捕獲到靜態(tài)文件的request請求,為什么會這樣呢?因為是一個系統(tǒng)app搗的鬼!
INSTALLED_APPS = ( 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', 'django.contrib.messages', #就是下面的這個app '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',)
如果我們沒有額外配置static路徑的話,系統(tǒng)會默認將所有靜態(tài)文件的請求發(fā)給staticfiles來處理,所以我們要將這個app靜止掉,這樣就可以完美的接收請求了,鑒于我百度了很多方法都沒有給出路由文件的配置方法,這樣會導(dǎo)致結(jié)果會不正確,所以我就把路由中的配置方法貼出來了。
static_dir = os.path.join(os.path.dirname(__file__),'../youappname/static')urlpatterns += patterns('', (r'^youappname/static/(?P<path>.*)$','django.views.static.serve',{'document_root':static_dir}),)
這樣就應(yīng)該不會再出現(xiàn)什么大的問題了。完美收官!!!
今天的工作繁瑣而又多,為了實現(xiàn)這個小功能我也是看了又看試了又試,果然英語不好真是硬傷額T.T…..今晚就到這了,下次有機會再寫一些其他小功能吧。
新聞熱點
疑難解答