国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

Django分析之Middleware中間件

2019-11-14 17:29:22
字體:
供稿:網(wǎng)友

      寫了幾周的腳本,今天終于開始接觸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讀取版本號了,下面是大致的處理流程,各位自己感受一下吧~

QQ圖片20141124220758

  好了,那么我們就開始一步步的完成吧~首先在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)我們想要的功能了,那么它的處理流程呢?自然也是和攔截器一樣了。

QQ截圖20141124223029

      為什么要注意這個處理流程呢?因為這個流程會影響我們在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…..今晚就到這了,下次有機會再寫一些其他小功能吧。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 内黄县| 共和县| 双城市| 安陆市| 邹城市| 新郑市| 衡阳县| 威信县| 盐池县| 乌苏市| 红原县| 汤阴县| 甘泉县| 辽源市| 璧山县| 凤城市| 志丹县| 龙井市| 榆树市| 尼勒克县| 宣恩县| 凌海市| 卢湾区| 涟源市| 馆陶县| 衡南县| 柘城县| 蓬安县| 资源县| 新兴县| 柳江县| 松溪县| 通辽市| 河西区| 唐海县| 禹州市| 和田市| 岢岚县| 龙门县| 岗巴县| 和平区|