Django(27)Django类视图添加装饰器[通俗易懂]

Django(27)Django类视图添加装饰器[通俗易懂]类视图在写视图的时候,Django除了使用函数作为视图,也可以使用类作为视图。使用类视图可以使用类的一些特性,比如继承等。Viewdjango.views.generic.base.View是主

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

类视图

在写视图的时候,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")
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/164914.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • tcping 用法「建议收藏」

    tcping 用法「建议收藏」目录一、概述二、软件安装三、使用二、参考资料一、概述ping程序发送icmp包,用于检测网络连通性,如果主机禁ping,就没办法判断连通性了。tcping程序基于tcp协议,查看网络延迟及开放的端口信息。二、软件安装1、下载tcping工具(根据自身系统选择32位/64位)tcping程序有很多不同的贡献者,此处下载的是EliFulkerson开发的tcping2、安装tcping将下载的exe文件放到c:\windows\system32\目录下面(如果下载的是64位的要把文件

  • java按位取反运算符_java源码补码

    java按位取反运算符_java源码补码一直纠结于位运算中的按位取反以及原码、反码、补码之间的各种关系,反正各种混淆各种懵逼。经过一小段时间才弄明白这个别人觉得很容易的问题。可能还是我基础不太好。位运算是对操作数以二进制为单位的进行的运算,位运算符则用于位运算。位运算符包括&(按位与)、|(按位或)、^(按位异或)、~(按位取反)等等…位运算符操作数可以是整型或字符型,结果为整型。按位取反是对补码进行运算,当运算完后,再将补…

  • 重大版四年级上册信息技术教案_走进计算机教案

    重大版四年级上册信息技术教案_走进计算机教案辽师大版信息技术四下第一单元第6课《最炫民族风》教案3.docx文档编号:536849文档页数:6上传时间:2019-01-13文档级别:文档类型:docx文档大小:13.25KB第6课最炫民族风教学目标设计知识与技能目标通过学习使学生掌握word里“页面设置”里“页边距”和“纸张”的使用和操作方法。在掌握以前学习有关知识的基础上,能够较灵活的应用该设置对页面进行调…

  • python处理通达信 5分钟数据 .lc5文件处理,生成csv文件,期货回测

    python处理通达信 5分钟数据 .lc5文件处理,生成csv文件,期货回测importstructimportdatetimeimportmathimporttime#根据二进制前两段拿到日期分时defget_date_str(H1,H2):year=math.floor(H1/2048)+2004month=math.floor(H1%2048/100)day=H1%2048%100hour=math.floor(H2/60)minute=H2%6.

  • Python小代码_9_求水仙花数

    Python小代码_9_求水仙花数foriinrange(100,1000):ge=i%10shi=i//10%10bai=i//100ifge**3+shi**3+bai

  • 架构设计——ID生成器「建议收藏」

    架构设计——ID生成器「建议收藏」一、分布式ID发号器要求很明确:不同机器同一时间生成不同ip;同一机器不同时间生成不同IP;所以根据需求,可选变量有:机器(网卡、IP)+时间,随机数二、WhynotUUID?UUID的实现:算法的核心思想是结合机器的网卡、当地时间、一个随机数来生成UUID。优势:保证唯一性;本地调用,不需要rpcUUID的缺陷:1.UUID较长,占用内存空间;往往用字符串表示…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号