Django类视图增加装饰器的许多方法

初始数据
views.py文件
from django.views import View
from django.http import HttpResponse

# 封装的装饰器
def my_decorator(func):
    def wrapper(request, *args, **kwargs):
        print('装饰器被调用')
        print('请求路径%s' % request.path)
        return func(request, *args, **kwargs)
    return wrapper

# 类视图
class DemoView(View):
    def get(self, request):
        print('get方法')
        return HttpResponse('ok')

    def post(self, request):
        print('post方法')
        return HttpResponse('ok')

    def put(self, request):
        print('put方法')
        return HttpResponse('ok')

    def delete(self, request):
        print('delete方法')
        return HttpResponse('ok')

urls.py文件
from django.urls import path
from .demo.views import DemoView

urlpatterns = [
    path("demo/", DemoView.as_view()),
1. 在urls中装饰 (不推荐)

# 方式简单,但因装饰行为配置在url中,单看视图的时候无法知道此视图还被添加了装饰器,不利于代码的完整性,不建议使用

urls.py文件
from django.urls import path
from .demo.views import DemoView, my_decorator


urlpatterns = [
    path("demo/", my_decorator(DemoView.as_view())),
2. 在类视图中装饰
from django.views import View
from django.http import HttpResponse
from django.utils.decorators import method_decorator

def my_decorator(func):
    def wrapper(request, *args, **kwargs):
        print('装饰器被调用')
        print('请求路径%s' % request.path)
        return func(request, *args, **kwargs)
    return wrapper

class DemoView(View):
	@method_decorator(my_decorator)
    def get(self, request):
        print('get方法')
        return HttpResponse('ok')
	
	@method_decorator(my_decorator)
    def post(self, request):
        print('post方法')
        return HttpResponse('ok')
	
	
    def put(self, request):
        print('put方法')
        return HttpResponse('ok')

	@method_decorator(my_decorator)
    def delete(self, request):
        print('delete方法')
        return HttpResponse('ok')
3. 在类视图装饰指定方法
from django.views import View
from django.http import HttpResponse
from django.utils.decorators import method_decorator

def my_decorator(func):
    def wrapper(request, *args, **kwargs):
        print('装饰器被调用')
        print('请求路径%s' % request.path)
        return func(request, *args, **kwargs)
    return wrapper

# @method_decorator(my_decorator, name='dispatch')
@method_decorator(my_decorator, name='get')
class DemoView(View):
    def get(self, request):
        print('get方法')
        return HttpResponse('ok')
	
    def post(self, request):
        print('post方法')
        return HttpResponse('ok')
	
    def put(self, request):
        print('put方法')
        return HttpResponse('ok')

    def delete(self, request):
        print('delete方法')
        return HttpResponse('ok')
4. 构造Mixin扩展类
from django.views import View
from django.http import HttpResponse
from django.utils.decorators import method_decorator

def my_decorator(func):
    def wrapper(request, *args, **kwargs):
        print('装饰器被调用')
        print('请求路径%s' % request.path)
        return func(request, *args, **kwargs)
    return wrapper


class MyDecoratorMixin(object):
    @classmethod
    def as_view(cls, *args, **kwargs):
        view = super().as_view(*args, **kwargs)
        view = my_decorator(view)
        return view


class DemoView(MyDecoratorMixin, View):
    def get(self, request):
        print('get方法')
        return HttpResponse('ok')
	
    def post(self, request):
        print('post方法')
        return HttpResponse('ok')
	
    def put(self, request):
        print('put方法')
        return HttpResponse('ok')

    def delete(self, request):
        print('delete方法')
        return HttpResponse('ok')
5. 重写dispatch方法
from django.views import View
from django.http import HttpResponse
from django.utils.decorators import method_decorator

def my_decorator(func):
    def wrapper(request, *args, **kwargs):
        print('装饰器被调用')
        print('请求路径%s' % request.path)
        return func(request, *args, **kwargs)
    return wrapper


class BaseView(View):
    @method_decorator(check_center_show)
    def dispatch(self, *args, **kwargs):
        return super().dispatch(*args, **kwargs)


class DemoView(BaseView):
    def get(self, request):
        print('get方法')
        return HttpResponse('ok')
	
    def post(self, request):
        print('post方法')
        return HttpResponse('ok')
	
    def put(self, request):
        print('put方法')
        return HttpResponse('ok')

    def delete(self, request):
        print('delete方法')
        return HttpResponse('ok')
.
.
.
.
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Python少年班

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值