您好,登錄后才能下訂單哦!
需求:當我們想禁止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("注冊成功")
解讀:
(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("發布成功")
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。