django 装饰器_spring视图解析器

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

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/165796.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Protostuff序列化分析

    Protostuff序列化分析Protostuff序列化分析最近项目中需要将业务对象直接序列化,然后存数据库;考虑到序列化、反序列化的时间以及生产文件的大小觉得Protobuf是一个很好的选择,但是Protobuf有的问题就是需要有一个.proto的描述文件,而且由Protobuf生成的对象用来作为业务对象并不是特别友好,往往业务对象和Protobuf对象存在一个互相转换的过程;考虑到我们仅仅是将业务对象直接序列化到数据库,发现Protobuf在这种情况下并不是特别的好;这时候发现了Protostuff,protostuff不需

    2022年5月6日
    44
  • windows命令行查看盘符列表_命令提示符怎么切换目录

    windows命令行查看盘符列表_命令提示符怎么切换目录1、windows系统使用快捷键:WIN+R,调出运行命令窗口,并输入CMD,回车进入dos界面:如下图所示:如上图所示可以看出我我所在目录是在C盘,现在我想要切换到D盘的某一个指定目录下,如:D:\software\back\java\tools\RabbitMQ\rabbitmq_server-3.7.3步骤1如下及步骤配图:相关命令#先从C盘切换至D盘

    2022年10月15日
    1
  • 基于matlab的直流电机仿真,基于MATLAB的无刷直流电机控制系统仿真

    基于MATLAB的无刷直流电机控制系统仿真(论文10000字)摘要:本论文主要关注无刷直流电机的调速控制系统,学习此电机的运行原理和PWM控制方法,简述了调速的概念、控制原理与方法、现状,并且学习并使用无刷直流电机的换相控制方法,并对无刷直流电动机调速系统进行设计。并通过Simulink来建模仿真和实验模拟得知电机的运行情况,并且根据仿真结果对无刷直流电机开始学习分析,从而达到对无刷直流电机的转速…

    2022年4月11日
    85
  • android开发之应用打包签名混淆流程

    ant打包apk,对其签名和混淆,防止反编译。

    2022年3月11日
    22
  • mysql的命名规则_Mysql命名规范

    mysql的命名规则_Mysql命名规范转自:https://blog.csdn.net/fujian9544/article/details/86649096数据库表字段命名规范内容由网上摘抄并进行总结/精简/标记后的内容本文包含了数据库命名数据库表命名数据库表字段命名SQL语言编码的规范一、数据库命名规范采用26个英文字母(区分大小写)和0-9的自然数(经常不需要)加上下划线’_’组成,命名简洁明确,多个单词用下划线’_’分隔,一个…

    2022年7月14日
    14
  • jenkins自动触发构建_jenkins调用bat脚本

    jenkins自动触发构建_jenkins调用bat脚本前言跑自动化用例每次用手工点击jenkins出发自动化用例太麻烦了,我们希望能每天固定时间跑,这样就不用管了,坐等收测试报告结果就行。jenkins的定时任务是用的crontab语法定时构建语法

    2022年7月28日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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