場景:
Django開發中,如果我們使用了類視圖,如:ListView、DetailView、UpdateView等,這時我們又想要對這個視圖添加一個裝飾器,來實作某種功能,這時候該怎么處理呢?
環境:
python 3.6
Django 1.11
錯誤用法
錯誤實作方式:
def is_login(func):
def wrapper(request,*args,**kwargs):
# 若檢測不到用戶就跳轉登錄頁面
if not request.session.get("user"):
return redirect(reverse('login'))
return func(request,*args, **kwargs)
return wrapper
@is_login
class myinfor(generic.ListView):
pass
報錯資訊:
AttributeError: 'function' object has no attribute 'as_view'
正確用法
實作方式一:
from django.utils.decorators import method_decorator
def is_login(func):
def wrapper(request,*args,**kwargs):
# 若檢測不到用戶就跳轉登錄頁面
if not request.session.get("user"):
return redirect(reverse('login'))
return func(request,*args, **kwargs)
return wrapper
# 使用method_decorator將裝飾器包裹起來,同時,name引數是必須的,dispatch支持所有請求型別,包含get、post等,如果指定某種請求方式改為:name='get'. 教程源站(bigyoung.cn)
@method_decorator(is_login, name='dispatch')
class myinfor(generic.ListView):
pass
實作方式二:
通過路由配置實作:(不推薦)
'''教程源站:BigYoung.cn'''
from django.utils.decorators import never_cache
urlpatterns += [
path('myinfo/', never_cache(myinfor.as_view()), name='myinfo'),
]
進階用法:
如果你有多個裝飾器需要裝飾,該如何操作呢?
歡迎大家訪問BigYoung小站(http://www.bigyoung.cn)查看完整版,
本文首發于BigYoung小站
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/141436.html
標籤:Python
上一篇:python九九乘法表程式代碼
下一篇:關于C++的O2優化
