django如何通過類視圖使用裝飾器
需求:當我們想禁止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在黑名單里,那么訪問注冊頁面時會彈出“禁止訪問”。
需求:但是,問題來了,當我們使用類視圖時,定義視圖函數(shù)時還有一個self參數(shù)。因為裝飾器沒有傳這個參,所以會報錯。應該怎么辦呢?
解決辦法:
(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("注冊成功")
解讀:
- 注意:針對函數(shù)定義的裝飾器,不能直接應用到類視圖的方法中,因為少了一個self參數(shù)
- 解決:可以使用method_decorator裝飾器,為函數(shù)裝飾器補充第一個self參數(shù),使它可以應用到類的方法中。
(2)給所有類視圖的所有方法應用裝飾器
類視圖的實現(xiàn)是通過as_view()這個方法來分發(fā)不同的請求來實現(xiàn)了。我們可以利用這點來給類視圖的所有方法都應用裝飾器。
一個比較簡單但是不實用的辦法就是在項目的urls.py上面來實現(xiàn)。在分發(fā)請求的前面加上裝飾器。
url(r'^register$',ban_ip(views.register.as_view()))
雖然這樣比較方便,但是太不美觀了。裝飾器的優(yōu)雅都被它破壞了,那我們應該怎么辦呢?
解決辦法:把as_view()的方法重寫一下,給它加入裝飾器的功能。
class register(View): # 重寫請求分發(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,"注冊頁面.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("發(fā)布成功")
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
Centos下實現(xiàn)安裝Python3.6和Python2共存
這篇文章主要介紹了Centos下實現(xiàn)安裝Python3.6和Python2共存,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-08-08詳解如何使用Python和正則表達式處理XML表單數(shù)據(jù)
在日常的Web開發(fā)中,處理表單數(shù)據(jù)是一個常見的任務,而XML是一種常用的數(shù)據(jù)格式,用于在不同的系統(tǒng)之間傳遞和存儲數(shù)據(jù),本文通過闡述一個技術問題并給出解答的方式,介紹如何使用Python和正則表達式處理XML表單數(shù)據(jù),需要的朋友可以參考下2023-09-09