欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

在Python的Django框架中包裝視圖函數

系統 1610 0

我們最終的視圖技巧利用了一個高級python技術。 假設你發現自己在各個不同視圖里重復了大量代碼,就像 這個例子:

            
def my_view1(request):
  if not request.user.is_authenticated():
    return HttpResponseRedirect('/accounts/login/')
  # ...
  return render_to_response('template1.html')

def my_view2(request):
  if not request.user.is_authenticated():
    return HttpResponseRedirect('/accounts/login/')
  # ...
  return render_to_response('template2.html')

def my_view3(request):
  if not request.user.is_authenticated():
    return HttpResponseRedirect('/accounts/login/')
  # ...
  return render_to_response('template3.html')


          

這里,每一個視圖開始都檢查request.user是否是已經認證的,是的話,當前用戶已經成功登陸站點否則就重定向/accounts/login/ (注意,雖然我們還沒有講到request.user,但是14章將要講到它.就如你所想像的,request.user描述當前用戶是登陸的還是匿名)

如果我們能夠叢每個視圖里移除那些 重復代,并且只在需要認證的時候指明它們,那就完美了。 我們能夠通過使用一個視圖包裝達到目的。 花點時間來看看這個:

            
def requires_login(view):
  def new_view(request, *args, **kwargs):
    if not request.user.is_authenticated():
      return HttpResponseRedirect('/accounts/login/')
    return view(request, *args, **kwargs)
  return new_view


          

函數requires_login,傳入一個視圖函數view,然后返回一個新的視圖函數new_view.這個新的視圖函數new_view在函數requires_login內定義 處理request.user.is_authenticated()這個驗證,從而決定是否執行原來的view函數

現在,我們可以從views中去掉if not request.user.is_authenticated()驗證.我們可以在URLconf中很容易的用requires_login來包裝實現.

            
from django.conf.urls.defaults import *
from mysite.views import requires_login, my_view1, my_view2, my_view3

urlpatterns = patterns('',
  (r'^view1/$', requires_login(my_view1)),
  (r'^view2/$', requires_login(my_view2)),
  (r'^view3/$', requires_login(my_view3)),
)


          

優化后的代碼和前面的功能一樣,但是減少了代碼冗余 現在我們建立了一個漂亮,通用的函數requires_login()來幫助我們修飾所有需要它來驗證的視圖
包含其他URLconf

如果你試圖讓你的代碼用在多個基于Django的站點上,你應該考慮將你的URLconf以包含的方式來處理。

在任何時候,你的URLconf都可以包含其他URLconf模塊。 對于根目錄是基于一系列URL的站點來說,這是必要的。 例如下面的,URLconf包含了其他URLConf:

            
from django.conf.urls.defaults import *

urlpatterns = patterns('',
  (r'^weblog/', include('mysite.blog.urls')),
  (r'^photos/', include('mysite.photos.urls')),
  (r'^about/$', 'mysite.views.about'),
)


          

admin模塊有他自己的URLconf,你僅僅只需要在你自己的代碼中加入include就可以了.

這里有個很重要的地方: 例子中的指向 include() 的正則表達式并 不 包含一個 $ (字符串結尾匹配符),但是包含了一個斜桿。 每當Django遇到 include() 時,它將截斷匹配的URL,并把剩余的字符串發往包含的URLconf作進一步處理。

繼續看這個例子,這里就是被包含的URLconf mysite.blog.urls :

            
from django.conf.urls.defaults import *

urlpatterns = patterns('',
  (r'^(\d\d\d\d)/$', 'mysite.blog.views.year_detail'),
  (r'^(\d\d\d\d)/(\d\d)/$', 'mysite.blog.views.month_detail'),
)


          

通過這兩個URLconf,下面是一些處理請求的例子:

  • ??? /weblog/2007/ :在第一個URLconf中,模式 r'^weblog/' 被匹配。 因為它是一個 include() ,Django將截掉所有匹配的文本,在這里是 'weblog/' 。URL剩余的部分是 2007/ , 將在 mysite.blog.urls 這個URLconf的第一行中被匹配到。 URL仍存在的部分為 2007/ ,與第一行的 mysite.blog.urlsURL設置相匹配。
  • ??? /weblog//2007/(包含兩個斜杠) 在第一個URLconf中,r'^weblog/'匹配 因為它有一個include(),django去掉了匹配的部,在這個例子中匹配的部分是'weblog/' 剩下的部分是/2007/ (最前面有一個斜杠),不匹配mysite.blog.urls中的任何一行.
  • ??? /about/ : 這個匹配第一個URLconf中的 mysite.views.about 視圖。


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 国产在线毛片 | 天天操天天擦 | 国内成人自拍视频 | 日本亚洲国产精品久久 | 成人免费在线视频 | 色在线看 | 国产精品亚洲综合第一区 | 五月天在线影院 | 视频一区二区三区免费观看 | 91精品国产综合久久久久久 | 国内精品视频在线观看 | 午夜精品视频在线看 | 69pao强力打造免费高清 | 亚洲高清免费视频 | 精品久久久久一区 | 欧美黑人玩白人巨大极品 | 日韩精品视频在线播放 | 美女视频黄在线观看 | 91免费在线视频 | 国产成人免费无庶挡视频 | 亚洲黄色第一页 | 亚洲在线观看网站 | 欧美色综合 | 日韩精品视频免费在线观看 | 在线播放高清视频www | 综合久久久久 | 奇米777视频国产 | 国产精品久久久久久久久 | 浮力影院在线 | 看个毛片 | 婷婷激情综合五月天 | 欧美精品激情 | 亚洲国产成人精品女人久久久 | 国产区久久 | 亚洲AV久久久噜噜噜久久 | 日韩精品视频一区二区三区 | 91欧美 | 国产大毛片| 午夜精品久久久久久久男人的天堂 | 中文字幕一区二区三区四区不卡 | 亚洲 无码 自拍 欧美 小说 |