日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

django class类即视图类添加装饰器的几种方法

發(fā)布時間:2025/3/15 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 django class类即视图类添加装饰器的几种方法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

根據(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ù)需要,就給他添加。

@method_decorator(my_decorator) def get(self, request):print('get方法')return HttpResponse('ok')

方法三:在類上面添加(給所有的視圖函數(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。