Django分析之Middleware中間件

      寫了幾周的腳本,今天終於開始接觸web框架了~學習Python的web框架,那麼Django就幾乎是必修課了,此次的工做是先打打下手,主要的任務是在setting中添加版本號,在渲染靜態css,js的路徑時附帶版本號,例如「example.v1124.css」,而後再在request請求中祛除掉版本號。爲何要這麼作呢?由於這樣作的話在前端輸出靜態文件的路徑就會加上就會加上版本號,這樣當開發出新的靜態文件的時候,客戶端就會強制刷新本地的緩存,爲了達到這個目的就要首先要在settings文件中配置,這樣就能夠每次修改的時候直接從settings讀取版本號了,下面是大體的處理流程,各位本身感覺一下吧~javascript

QQ圖片20141124220758

  好了,那麼咱們就開始一步步的完成吧~首先在settings文件中定義好一個版本號的變量。css

#Static file version number
STATIC_VERSION = 'v1124'

而後就是在你要使用版本號的app中的views文件中取到這個變量並賦值給須要渲染的模板中了。html

#要想在settings文件中取到變量就要先導入模塊
from django.conf import settings

#在settings配置文件中取得靜態文件版本號
version = settings.STATIC_VERSION

#下面這個函數是例子.....
def index(request):
        template = loader.get_template('base/base_index.html')
        #將取得的靜態文件版本號傳入到模板中
         context = Context({'version':version})
        return HttpResponse(template.render(context))

這樣就能夠在HTML文件中這樣寫靜態文件路徑了。前端

<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>

      到這一步,當你打開瀏覽器後臺的時候你就會發現你的路徑就會改變了,可是這個時候當你再刷新的時候就會出現靜態文件找不到的問題了,爲何會這樣呢?由於這個時候的瀏覽器會繼續按照新的路徑去請求靜態文件,可是你會發現你靜態文件的物理地址實際上是沒有改變過的,因此這時候你請求的是新的地址,天然也就取不到了,那麼咱們該怎麼辦呢?java

      下面就是咱們的主角Middleware出場了!那什麼是Middleware呢?文檔上說是中間件,可能很差理解,那麼其實就是Javaweb框架中Struts2中的攔截器,不管是做用仍是原理都是一模一樣的,那麼這樣一等價的話就很好理解Django中的Middleware了,既然是攔截器那麼能作的就不只僅是過濾一個靜態文件版本號這麼簡單咯,查看了文檔以後發現它還有不少不少實用的功能,那麼都能哪些方法呢?web

process_request  接受request以後肯定所執行的view以前 正則表達式

process_view  肯定了所要執行的view以後 view真正執行以前django

process_response   view 執行以後瀏覽器

process_exception(self, request, exception)  view拋出異常緩存

經過咱們繼承實現上面的一個或者多個方法就能夠實現咱們想要的功能了,那麼它的處理流程呢?天然也是和攔截器同樣了。

QQ截圖20141124223029

      爲何要注意這個處理流程呢?由於這個流程會影響咱們在settings文件中配置咱們本身的Middleware順序,其實在settings文件中咱們的配置順序就是它執行的順序了,那麼說到底該如何安裝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',
)

     這樣咱們就已經安裝好了本身的中間件了,那下面就能夠攔截下全部的request請求了,如今咱們該在中間件中處理咱們的業務邏輯了

#coding=utf-8
import urllib,pdb,re
from django.template import RequestContext
from django.shortcuts import render_to_response

class 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開頭,後面是數字,因此用正則將這樣的字符串替換成空。

如今按照以前流程圖裏面的咱們是否是就完成了呢?顯然不是嘛~僅僅這樣作的話你會發現你的Middleware並無起做用,咱們用pdb斷點調試發現,其實咱們並無捕獲到靜態文件的request請求,爲何會這樣呢?由於是一個系統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路徑的話,系統會默認將全部靜態文件的請求發給staticfiles來處理,因此咱們要將這個app靜止掉,這樣就能夠完美的接收請求了,鑑於我百度了不少方法都沒有給出路由文件的配置方法,這樣會致使結果會不正確,因此我就把路由中的配置方法貼出來了。

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}),
)

     這樣就應該不會再出現什麼大的問題了。完美收官!!!

今天的工做繁瑣而又多,爲了實現這個小功能我也是看了又看試了又試,果真英語很差真是硬傷額T.T…..今晚就到這了,下次有機會再寫一些其餘小功能吧。

相關文章
相關標籤/搜索