初始数据
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')