django class类即视图类添加装饰器的几种方法
根據(jù)別人發(fā)布整理,個人愛好收集(原文:https://blog.csdn.net/mydistance/article/details/83958655 )
一、定義視圖類
定義類視圖,且類視圖繼承自View(舉例)
from django.views.generic import Viewclass DemoView(View):"""具體的視圖函數(shù)"""定義路由:
urlpatterns = [# 類視圖:注冊url(r'^register/$',views.DemoView.as_view()), ]類視圖的好處:
代碼可讀性好,類視圖相對于函數(shù)視圖有更高的復(fù)用性
二、視圖類使用裝飾器:
定義一個裝飾器:
def my_decorator(func):def wrapper(request, *args, **kwargs): print('自定義裝飾器被調(diào)用了')print('請求路徑%s' % request.path) return func(request, *args, **kwargs) return wrapper方法一:在url配置中裝飾:
urlpatterns = [# 我們在路由部分, 把定義好的裝飾器添加到當(dāng)前的函數(shù)上# 這里需要注意: as_view() 會返回一個 view() 函數(shù)# 所以我們把裝飾器添加到view()函數(shù)上.url(r'^demo/$', views.my_decorate(views.DemoView.as_view())) ]弊端:單看視圖的時候,無法知道此視圖還被添加了裝飾器,不利于代碼的完整性;此種方法會為類視圖中的所有請求方法都加上裝飾器行為
方法二:調(diào)用系統(tǒng)的裝飾器(給某個視圖函數(shù)添加裝飾器)
需要使用method_decorator將其轉(zhuǎn)換為適用于類視圖方法的裝飾器,這種方法直接將裝飾器應(yīng)用在了具體的視圖函數(shù)上,哪個視圖函數(shù)需要,就給他添加。
方法三:在類上面添加(給所有的視圖函數(shù)都添加裝飾器)
@method_decorator(my_decorator, name='dispatch') class DemoView(View):因為dispatch方法被 as_view() 中的 view() 調(diào)用,所以我們對這個方法添加裝飾器, 也就相當(dāng)于對整個類視圖的方法添加裝飾器。
方法四:定義裝飾器時,添加一個self參數(shù)
裝飾器如下:
def my_decorator(func):# 此處增加了selfdef wrapper(self, request, *args, **kwargs): print('自定義裝飾器被調(diào)用了')print('請求路徑%s' % request.path)# 此處增加了selfreturn func(self, request, *args, **kwargs) return wrapper使用:直接用自定義裝飾器裝飾在函數(shù)視圖上
@my_decoratordef get(self, request):print('get方法')return HttpResponse('ok')方法五:用Mixin擴(kuò)展類的形式,繼承多個裝飾器,并為類視圖中的所有函數(shù)視圖添加裝飾行為
假設(shè)定義了兩個裝飾器@my_decorator和@my_decorator2
# 第一個擴(kuò)展類, 讓他繼承自 object class BaseView(object): @classmethod def as_view(cls, *args, **kwargs): view = super().as_view(*args, **kwargs) view = my_decorator(view) return view # 第二個擴(kuò)展類,讓他繼承自object class Base2View(object): @classmethod def as_view(cls, *args, **kwargs): view = super().as_view(*args, **kwargs) view = my_decorator2(view) return view # 類視圖, 讓他除了繼承自這兩個父類外, 最后繼承View類. class DemoView(BaseView, Base2View,View): def get(self, request): print('get方法') return HttpResponse('ok') def post(self, request): print('post方法') return HttpResponse('ok')?
轉(zhuǎn)載于:https://www.cnblogs.com/weilaibuxiangshuo/p/10411962.html
總結(jié)
以上是生活随笔為你收集整理的django class类即视图类添加装饰器的几种方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AWS EC2实例Ubuntu系统设置r
- 下一篇: AltiumDesigner17快捷键