欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

在Python的Django框架中包裝視圖函數(shù)

 更新時間:2015年07月20日 10:38:55   投稿:goldensun  
這篇文章主要介紹了在Python的Django框架中包裝視圖函數(shù)的方法,即requires_login的相關(guān)方法,需要的朋友可以參考下

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

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是否是已經(jīng)認(rèn)證的,是的話,當(dāng)前用戶已經(jīng)成功登陸站點否則就重定向/accounts/login/ (注意,雖然我們還沒有講到request.user,但是14章將要講到它.就如你所想像的,request.user描述當(dāng)前用戶是登陸的還是匿名)

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

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

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

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

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

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

如果你試圖讓你的代碼用在多個基于Django的站點上,你應(yīng)該考慮將你的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() 的正則表達式并 不 包含一個 $ (字符串結(jié)尾匹配符),但是包含了一個斜桿。 每當(dāng)Django遇到 include() 時,它將截斷匹配的URL,并把剩余的字符串發(fā)往包含的URLconf作進一步處理。

繼續(xù)看這個例子,這里就是被包含的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設(shè)置相匹配。
  •     /weblog//2007/(包含兩個斜杠) 在第一個URLconf中,r'^weblog/'匹配 因為它有一個include(),django去掉了匹配的部,在這個例子中匹配的部分是'weblog/' 剩下的部分是/2007/ (最前面有一個斜杠),不匹配mysite.blog.urls中的任何一行.
  •     /about/ : 這個匹配第一個URLconf中的 mysite.views.about 視圖。

相關(guān)文章

  • Python如何實現(xiàn)FTP功能

    Python如何實現(xiàn)FTP功能

    在本篇文章里小編給大家整理的是關(guān)于Python實現(xiàn)的簡易FTP的實例內(nèi)容,有興趣的朋友們可以參考下。
    2020-05-05
  • 68行Python代碼實現(xiàn)帶難度升級的貪吃蛇

    68行Python代碼實現(xiàn)帶難度升級的貪吃蛇

    本文主要介紹了Python代碼實現(xiàn)帶難度升級的貪吃蛇,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Mac中pyenv的安裝與使用教程

    Mac中pyenv的安裝與使用教程

    pyenv支持linux下python多版本的共存和版本之間切換,非常方便,下面這篇文章主要給大家介紹了關(guān)于Mac中pyenv安裝與使用的相關(guān)資料,需要的朋友可以參考下
    2022-02-02
  • python使用itchat庫實現(xiàn)微信機器人(好友聊天、群聊天)

    python使用itchat庫實現(xiàn)微信機器人(好友聊天、群聊天)

    itchat是一個開源的微信個人號接口,可以使用該庫進行微信網(wǎng)頁版中的所有操作。本文主要使用該庫完成一個能夠處理微信消息的的圖靈機器人,包括好友聊天、群聊天,感興趣的朋友跟隨小編一起學(xué)習(xí)吧
    2018-01-01
  • linux安裝Python3.4.2的操作方法

    linux安裝Python3.4.2的操作方法

    這篇文章主要介紹了linux安裝Python3.4.2的操作方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-09-09
  • 如何在Python中實現(xiàn)goto語句的方法

    如何在Python中實現(xiàn)goto語句的方法

    這篇文章主要介紹了如何在Python中實現(xiàn)goto語句的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • Python3使用xml.dom.minidom和xml.etree模塊兒解析xml文件封裝函數(shù)的方法

    Python3使用xml.dom.minidom和xml.etree模塊兒解析xml文件封裝函數(shù)的方法

    這篇文章主要介紹了Python3使用xml.dom.minidom和xml.etree模塊兒解析xml文件,封裝函數(shù)的方法,代碼簡單易懂,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-09-09
  • python opencv實現(xiàn)圖像矯正功能

    python opencv實現(xiàn)圖像矯正功能

    這篇文章主要為大家詳細(xì)介紹了python opencv實現(xiàn)圖像矯正功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • Python pandas之多級索引取值詳解

    Python pandas之多級索引取值詳解

    這篇文章主要為大家介紹了Python pandas之多級索引取值,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • Python常用模塊之threading和Thread模塊及線程通信

    Python常用模塊之threading和Thread模塊及線程通信

    這篇文章主要介紹了Python常用模塊之threading和Thread模塊及線程通信,文章為圍繞主題的相關(guān)內(nèi)容展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的朋友看可以參考一下方法
    2022-06-06

最新評論