django如何通過類視圖使用裝飾器
需求:當(dāng)我們想禁止ip黑名單訪問我們的某些頁面時,例如注冊頁面。應(yīng)該怎么操作呢?
解決方案:這時候我們可以設(shè)計一個裝飾器,過濾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("注冊成功")
這樣就可以達(dá)到一個效果。如果ip在黑名單里,那么訪問注冊頁面時會彈出“禁止訪問”。
需求:但是,問題來了,當(dāng)我們使用類視圖時,定義視圖函數(shù)時還有一個self參數(shù)。因為裝飾器沒有傳這個參,所以會報錯。應(yīng)該怎么辦呢?
解決辦法:
(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ù)定義的裝飾器,不能直接應(yīng)用到類視圖的方法中,因為少了一個self參數(shù)
- 解決:可以使用method_decorator裝飾器,為函數(shù)裝飾器補充第一個self參數(shù),使它可以應(yīng)用到類的方法中。
(2)給所有類視圖的所有方法應(yīng)用裝飾器
類視圖的實現(xiàn)是通過as_view()這個方法來分發(fā)不同的請求來實現(xiàn)了。我們可以利用這點來給類視圖的所有方法都應(yīng)用裝飾器。
一個比較簡單但是不實用的辦法就是在項目的urls.py上面來實現(xiàn)。在分發(fā)請求的前面加上裝飾器。
url(r'^register$',ban_ip(views.register.as_view()))
雖然這樣比較方便,但是太不美觀了。裝飾器的優(yōu)雅都被它破壞了,那我們應(yīng)該怎么辦呢?
解決辦法:把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)對類視圖的某個方法應(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)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
python練習(xí)之曾經(jīng)很火的小人畫愛心表白代碼
小編有個好兄弟最近在追妹子,跟妹子打得火熱!就差臨門一腳了,這一jio我?guī)兔ρa上去了!他問有沒有什么酷炫的表白方式,可以給人心動的趕jio,表白的方式有許多種今天小編來教大家一個之前很火的小人畫愛心表白代碼2021-09-09
Centos下實現(xiàn)安裝Python3.6和Python2共存
這篇文章主要介紹了Centos下實現(xiàn)安裝Python3.6和Python2共存,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-08-08
詳解如何使用Python和正則表達(dá)式處理XML表單數(shù)據(jù)
在日常的Web開發(fā)中,處理表單數(shù)據(jù)是一個常見的任務(wù),而XML是一種常用的數(shù)據(jù)格式,用于在不同的系統(tǒng)之間傳遞和存儲數(shù)據(jù),本文通過闡述一個技術(shù)問題并給出解答的方式,介紹如何使用Python和正則表達(dá)式處理XML表單數(shù)據(jù),需要的朋友可以參考下2023-09-09

