中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2020-09-11 01:25:52 來源:腳本之家 閱讀:192 作者:苦瓜爆炒牛肉 欄目:開發技術

需求:當我們想禁止ip黑名單訪問我們的某些頁面時,例如注冊頁面。應該怎么操作呢?

解決方案:這時候我們可以設計一個裝飾器,過濾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,"注冊頁面.html")


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

這樣就可以達到一個效果。如果ip在黑名單里,那么訪問注冊頁面時會彈出“禁止訪問”。

需求:但是,問題來了,當我們使用類視圖時,定義視圖函數時還有一個self參數。因為裝飾器沒有傳這個參,所以會報錯。應該怎么辦呢?

解決辦法:

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

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

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

解讀:

  • 注意:針對函數定義的裝飾器,不能直接應用到類視圖的方法中,因為少了一個self參數
  • 解決:可以使用method_decorator裝飾器,為函數裝飾器補充第一個self參數,使它可以應用到類的方法中。

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

類視圖的實現是通過as_view()這個方法來分發不同的請求來實現了。我們可以利用這點來給類視圖的所有方法都應用裝飾器。

一個比較簡單但是不實用的辦法就是在項目的urls.py上面來實現。在分發請求的前面加上裝飾器。

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

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

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

class register(View):
 
 # 重寫請求分發方法,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,"注冊頁面.html")

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

(3)對類視圖的某個方法應用裝飾器

@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("發布成功")

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

台北县| 临高县| 罗源县| 天水市| 内丘县| 皋兰县| 华安县| 额济纳旗| 喀喇沁旗| 威宁| 仙居县| 汝城县| 太康县| 台北市| 宁乡县| 阿克苏市| 浑源县| 蕲春县| 广宗县| 大城县| 定西市| 长汀县| 丹棱县| 镇雄县| 获嘉县| 德州市| 永清县| 江城| 德庆县| 平阳县| 澄城县| 临海市| 富锦市| 绵阳市| 门头沟区| 曲麻莱县| 赞皇县| 耒阳市| 板桥市| 平泉县| 江山市|