最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

django如何通過類視圖使用裝飾器

 更新時(shí)間:2019年07月24日 10:25:35   作者:苦瓜爆炒牛肉  
這篇文章主要介紹了django如何設(shè)計(jì)裝飾器過濾黑名單,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

需求:當(dāng)我們想禁止ip黑名單訪問我們的某些頁面時(shí),例如注冊(cè)頁面。應(yīng)該怎么操作呢?

解決方案:這時(shí)候我們可以設(shè)計(jì)一個(gè)裝飾器,過濾ip黑名單。

裝飾器的寫法如下:

from functools import wraps


def ban_ip(func):
 @wraps(func)
 def wrapper(request,*args,**kwargs):
 IP = request.META.get("REMOTE_ADDR")
 if IP in ["127.0.0.1"]: # 可以添加ip黑名單到列表里
  return HttpResponse("禁止訪問")
 return func
 return wrapper

如果不是類視圖,可以這樣使用:

@ban_ip
def get_register(request):
 return render(request,"注冊(cè)頁面.html")


def post_resiger(request):
 name = request.POST.get("name")
 password = request.POST.get("password")
 print(name)
 print(password)
 return HttpResponse("注冊(cè)成功")

這樣就可以達(dá)到一個(gè)效果。如果ip在黑名單里,那么訪問注冊(cè)頁面時(shí)會(huì)彈出“禁止訪問”。

需求:但是,問題來了,當(dāng)我們使用類視圖時(shí),定義視圖函數(shù)時(shí)還有一個(gè)self參數(shù)。因?yàn)檠b飾器沒有傳這個(gè)參,所以會(huì)報(bào)錯(cuò)。應(yīng)該怎么辦呢?

解決辦法:

(1)給類視圖中特定的方法

class register(View):
 @method_decorator(ban_ip)
 def get(self,request):
 return render(request,"注冊(cè)頁面.html")

 def post(self,request):
 name = request.POST.get("name")
 password = request.POST.get("password")
 print(name)
 print(password)
 return HttpResponse("注冊(cè)成功")

解讀:

  • 注意:針對(duì)函數(shù)定義的裝飾器,不能直接應(yīng)用到類視圖的方法中,因?yàn)樯倭艘粋€(gè)self參數(shù)
  • 解決:可以使用method_decorator裝飾器,為函數(shù)裝飾器補(bǔ)充第一個(gè)self參數(shù),使它可以應(yīng)用到類的方法中。

(2)給所有類視圖的所有方法應(yīng)用裝飾器

類視圖的實(shí)現(xiàn)是通過as_view()這個(gè)方法來分發(fā)不同的請(qǐng)求來實(shí)現(xiàn)了。我們可以利用這點(diǎn)來給類視圖的所有方法都應(yīng)用裝飾器。

一個(gè)比較簡單但是不實(shí)用的辦法就是在項(xiàng)目的urls.py上面來實(shí)現(xiàn)。在分發(fā)請(qǐng)求的前面加上裝飾器。

url(r'^register$',ban_ip(views.register.as_view()))

雖然這樣比較方便,但是太不美觀了。裝飾器的優(yōu)雅都被它破壞了,那我們應(yīng)該怎么辦呢?

解決辦法:把a(bǔ)s_view()的方法重寫一下,給它加入裝飾器的功能。

class register(View):
 
 # 重寫請(qǐng)求分發(fā)方法,as_view()的核心語句
 @method_decorator(ban_ip)
 def dispatch(self, request, *args, **kwargs):
 return super().dispatch(request, *args, **kwargs)

 def get(self,request):
 return render(request,"注冊(cè)頁面.html")

 def post(self,request):
 name = request.POST.get("name")
 password = request.POST.get("password")
 print(name)
 print(password)
 return HttpResponse("注冊(cè)成功")

(3)對(duì)類視圖的某個(gè)方法應(yīng)用裝飾器

@method_decorator(ban_ip,name='get')
class register(View):

 def get(self,request):
 return render(request,"post.html")

 def post(self,request):
 title = request.POST.get("title")
 content = request.POST.get("content")
 print(title)
 print(content)
 return HttpResponse("發(fā)布成功")

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • python3.3教程之模擬百度登陸代碼分享

    python3.3教程之模擬百度登陸代碼分享

    因工作需要,研究了一下模擬百度的登陸,開發(fā)環(huán)境使用了python3,大家參考使用吧
    2014-01-01
  • Pytest中conftest.py的用法

    Pytest中conftest.py的用法

    conftest.py文件到底該如何使用呢,下面我們就來詳細(xì)了解一下conftest.py文件的特點(diǎn)和使用方法吧,感興趣的小伙伴們可以參考一下
    2021-06-06
  • python使用fileinput模塊實(shí)現(xiàn)逐行讀取文件的方法

    python使用fileinput模塊實(shí)現(xiàn)逐行讀取文件的方法

    這篇文章主要介紹了python使用fileinput模塊實(shí)現(xiàn)逐行讀取文件的方法,涉及Python中fileinput模塊操作文件的相關(guān)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-04-04
  • python字符串拼接+和join的區(qū)別詳解

    python字符串拼接+和join的區(qū)別詳解

    這篇文章主要給大家介紹了關(guān)于python字符串拼接+和join的區(qū)別的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • python讀取配置文件方式(ini、yaml、xml)

    python讀取配置文件方式(ini、yaml、xml)

    這篇文章主要介紹了python讀取配置文件方式(ini、yaml、xml),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • Python的Bottle框架中返回靜態(tài)文件和JSON對(duì)象的方法

    Python的Bottle框架中返回靜態(tài)文件和JSON對(duì)象的方法

    這篇文章主要介紹了Python的Bottle框架中返回靜態(tài)文件和JSON對(duì)象的方法,Bottle框架在Python開發(fā)者中具有很高的人氣,需要的朋友可以參考下
    2015-04-04
  • Python如何讀取文件中圖片格式

    Python如何讀取文件中圖片格式

    這篇文章主要介紹了Python如何讀取文件中圖片格式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • python關(guān)閉print輸出信息詳情

    python關(guān)閉print輸出信息詳情

    這篇文章主要介紹了python關(guān)閉print輸出信息詳情,當(dāng)我們遇到需要關(guān)閉print輸出信息的情況,我們可以通過控制sys.stdout來實(shí)現(xiàn)print輸出的開關(guān),下面文章就用一個(gè)簡單的例子來實(shí)現(xiàn),需要的小伙伴可以參考一下
    2022-02-02
  • 使用python繪制二維圖形示例

    使用python繪制二維圖形示例

    今天小編就為大家分享一篇使用python繪制二維圖形示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • Django框架之django admin的命令行詳解

    Django框架之django admin的命令行詳解

    這篇文章主要介紹了Django框架之django admin的命令行知識(shí),文中通過示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2021-09-09

最新評(píng)論

晋中市| 大厂| 宁乡县| 桦南县| 西安市| 永康市| 盐源县| 昭苏县| 张北县| 陇南市| 澜沧| 伊吾县| 安丘市| 庆元县| 恩施市| 淮南市| 察哈| 营口市| 沙雅县| 中江县| 全南县| 黔西| 鹤山市| 瑞安市| 阿合奇县| 湖州市| 吐鲁番市| 固原市| 长葛市| 尼勒克县| 沅陵县| 娄烦县| 平邑县| 贞丰县| 仪征市| 达州市| 河东区| 沂南县| 贵定县| 化德县| 高密市|