• Django(27)Django类视图添加装饰器


    类视图

    在写视图的时候,Django除了使用函数作为视图,也可以使用类作为视图。使用类视图可以使用类的一些特性,比如继承等。
     

    View

    django.views.generic.base.View是主要的类视图,所有的类视图都是继承自他。如果我们写自己的类视图,也可以继承自他。然后再根据当前请求的method,来实现不同的方法。比如这个视图只能使用get的方式来请求,那么就可以在这个类中定义get(self,request,*args,**kwargs)方法。以此类推,如果只需要实现post方法,那么就只需要在类中实现post(self,request,*args,**kwargs)。示例代码如下:

    from django.views import View
    class BookDetailView(View):
        def get(self,request,*args,**kwargs):
            return render(request,'detail.html')
    

    类视图写完后,还应该在urls.py中进行映射,映射的时候就需要调用View的类方法as_view()来进行转换。示例代码如下:

    urlpatterns = [        
        path("detail/<book_id>/",views.BookDetailView.as_view(),name='detail')
    ]
    

    除了get方法,View还支持以下方法['get','post','put','patch','delete','head','options','trace']
    如果用户访问了View中没有定义的方法。比如你的类视图只支持get方法,而出现了post方法,那么就会把这个请求转发给http_method_not_allowed(request,*args,**kwargs)。示例代码如下:

    class AddBookView(View):
        def post(self,request,*args,**kwargs):
            return HttpResponse("书籍添加成功!")
    
        def http_method_not_allowed(self, request, *args, **kwargs):
            return HttpResponse("您当前采用的method是:%s,本视图只支持使用post请求!" % request.method)
    

    urls.py中的映射如下:

    path("addbook/",views.AddBookView.as_view(),name='add_book')
    

    如果你在浏览器中访问addbook/,因为浏览器访问采用的是get方法,而addbook只支持post方法,因此以上视图会返回您当前采用的method是:GET,本视图只支持使用post请求!。
    其实不管是get请求还是post请求,都会走dispatch(request,*args,**kwargs)方法,所以如果实现这个方法,将能够对所有请求都处理到。
     
    Django还为我们提供了很多内置的视图类,如下

    __all__ = [
        'View', 'TemplateView', 'RedirectView', 'ArchiveIndexView',
        'YearArchiveView', 'MonthArchiveView', 'WeekArchiveView', 'DayArchiveView',
        'TodayArchiveView', 'DateDetailView', 'DetailView', 'FormView',
        'CreateView', 'UpdateView', 'DeleteView', 'ListView', 'GenericViewError',
    ]
    

    小伙伴们如果需要使用,可以去查看官方文档或者查看源码进行了解
     

    给类视图添加装饰器

    我们访问首页如果有登录,则访问,如果没有登录则重定向到登录页,此时可以使用django内置的method_decorator,给类添加装饰器,示例代码如下

    from django.utils.decorators import method_decorator
    '''自定义登录装饰器'''
    def login_required(func):
        def wrapper(request,*args,**kwargs):
            if request.GET.get("username"):
                return func(request,*args,**kwargs)
            else:
                return redirect(reverse('login'))
        return wrapper
    
    class IndexView(View):
        @method_decorator(login_required)
        def get(self,request,*args,**kwargs):
            return HttpResponse("index")
    
  • 相关阅读:
    以下文件中的行尾不一致。要将行尾标准化吗
    用户 NT AUTHORITYNETWORK SERVICE 登录失败
    sql server 2008 不允许保存更改,您所做的更改要求删除并重新创建以下表 的解决办法
    附加数据库对于服务器失败(Microsoft.SqlServer.Smo),无法升级数据库,因为它是只读的,或者具有只读文件
    IIS上部署MVC网站,打开后ExtensionlessUrlHandler-Integrated-4.0解决方法
    HTTP 错误 404.2
    vs智能提示突然消失的解决办法 (vs2008 vs2010 vs2012 智能提示)
    Visual Studio 常用快捷键
    403.14-Forbidden Web 服务器被配置为不列出此目录的内容及Login on failed for "IIS APPPOOLASP.NET v4.0"问题
    短信轰炸PC版
  • 原文地址:https://www.cnblogs.com/jiakecong/p/14800468.html
Copyright © 2020-2023  润新知