Django ListView DetailView等基於類的視圖如何添加裝飾器?

場景:

Django開發中,若是咱們使用了類視圖,如:ListView、DetailView、UpdateView等,這時咱們又想要對這個視圖添加一個裝飾器,來實現某種功能,這時候該怎麼處理呢?python

環境:

python 3.6 django

Django 1.11session

錯誤用法

錯誤實現方式:

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'app

正確用法

實現方式一:

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複製代碼

實現方式二:

經過路由配置實現:(不推薦)post

'''教程源站:BigYoung.cn'''

from django.utils.decorators import never_cache

urlpatterns += [
    path('myinfo/', never_cache(myinfor.as_view()), name='myinfo'),
]複製代碼

進階用法:

若是你有多個裝飾器須要裝飾,該如何操做呢? 歡迎你們訪問BigYoung小站(www.bigyoung.cn)查看完整版。url

本文首發於BigYoung小站spa

相關文章
相關標籤/搜索