91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

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

昭苏县| 舒城县| 岚皋县| 青岛市| 湛江市| 封开县| 政和县| 印江| 白水县| 福鼎市| 济阳县| 那曲县| 左权县| 祁阳县| 尼勒克县| 高安市| 凤庆县| 巴中市| 迭部县| 读书| 台东县| 广灵县| 克什克腾旗| 郎溪县| 乌审旗| 合水县| 剑川县| 钟祥市| 阳高县| 呈贡县| 桦甸市| 甘肃省| 什邡市| 南京市| 阿拉尔市| 乐陵市| 邯郸市| 新宁县| 乌审旗| 罗定市| 政和县|