zoukankan      html  css  js  c++  java
  • Django框架之类视图

    所谓类视图就是用类定义的视图,其主要支持客户端在用不同的请求方式发起的HTTP请求。

    首先,我们需要明确一下类视图的好处:

    1.代码可读向高;

    2.相对于视图函数具有更高的代码复用性;

    3.便于维护。

    类视图的定义格式如下:

    # 1. 导入视图模块
    from django.views.generic import View

    class
    ObjectView(View): """2. 定义一个类视图"""   


      # 3.编写视图函数 def get(self, request): """处理GET请求""" return HttpResponse('以GET请求方式发起的HTTP请求') def post(self, request): """处理POST请求""" return HttpResponse('以POST请求方式发起的HTTP请求')

    在类视图定义的时候我们需要注意一下几点:

    1. 类视图必须继承View类;

    2. 类视图中的方法必须以请求方式的小写形式来命名;

    视图函数我们编写完了,那么接下我们就要配置路由了。

    我们需要在子路由中添加上一下代码:

    urlpatterns = [
        # 视图函数:注册
        # url(r'^index/$', views.index, name='index'),
        # 类视图:注册
        url(r'^index_get/$', views.ObjectView.as_view(), name='ObjectView'),
    ]

    这里注意类视图一定要调用as_view()方法。

    下面我来简述一下as_view()方法的执行流程:

    1. 类视图在路由中调用as_view()方法,

    2. as_view()方法语法上是一个闭包,它会调用它的内层函数view(),

    3. view()会将请求的对象及参数接收,传递给dispatch()方法并调用dispatch()方法,

    4. dispatch()方法会接收传递的参数,并且通过python中的底层函数getattr()获取到根据请求方式确定的类视图中的方法。

    5. 最后再将方法的引用逐层返回,从而完成类视图中的方法的调用。

    为类视图添加装饰器

    装饰器对大家来说,我相信都不陌生,其原理我就不赘述了,

    接下我会为大家简单介绍一下如何给类视图添加装饰器。

    说到需要给类视图添加装饰器,那么第一步就是编写一个装饰器。

    1.编写装饰器:

    def decorator(func):
        def inner(*args, **kwargs):
            print('装饰内容1')
            ret = func(*args, **kwargs)
            print('装饰内容2')
            return ret
        return inner

    既然装饰器编写完成,那么接下来我们就编写一个类视图。

    2. 编写类视图:

    class register2(View):
        def get(self,request):
            print('Classess GET Content')
            return HttpResponse('Classess GET OK')
    
        def post(self,request):
            print('Classess POST Content')
            return HttpResponse('Classess POST OK')

    现在,我们所有需要的东西都已准备完毕了,万事俱备只欠添加了。

    3. 给类视图添加装饰器:

    为类视图添加装饰器,一共有三种方法,接下来我将会为大家简单介绍一下类视图添加装饰器的三种方法。

    第一种方式给类视图添加装饰器:

    # 第一种方式给类视图添加装饰器
    # 1. 导入模块
    from django.utils.decorators import method_decorator
    
    # 2. 给类视图添加装饰器
    @method_decorator(decorator,name='dispatch')
    class register2(View):
        pass
    # 注意:
    # 通过这种方式添加的装饰器,会给所有的方法添加上。

    第二种方式给类视图添加装饰器:

    # 第二种方式给类视图添加装饰器
    # 1. 导入模块
    from django.utils.decorators import method_decorator
    
    # 2. 给类视图添加装饰器
    @method_decorator(decorator, name='get')
    class registter2(View):
        pass
    
    # 注意:
    # 通过此方式添加的装饰器,会给类视图中指定的方法添加上。

    第三种方式给类视图添加装饰器:

    # 第三种方式给类视图添加装饰器
    # 1. 导入模块
    from django.utils.decorators import method_decorator
    
    # 2. 给类视图添加装饰器
    class register2(View):
        @method_decorator(decorator)
        def get(self,reqeust):
            return HttpResponse('Is ok ')
    
        def post(self,reqeust):
            return HttpResponse('Is ok ')
    
    # 注意:
    # 通过此方式可以给类中的多个方法添加装饰器

    类视图的扩展:

    类视图的扩展,直白点说就是类的继承,将所有重复的代码,封装到一个工具类中,然后通过继承这个工具类,就可以直接调用这些封装好的属性或方法了。

    # 扩展类的命名一般以 Mixin 结尾
    class CreateMixin(object):
        def create(self,request,*args,**kwargs):
            print('Create Mixin Run ...')
            return HttpResponse('Create')
    
    class ListMixin(object):
        def lister(self,request,*args ,**kwargs):
            print('List Mixin Run ...')
            return HttpResponse('List')
    
    class IndexView(CreateMixin, ListMixin, View):
        def get(self,request):
            resp = self.create(request)
            resp.content = str(resp.content.decode()) + ' Index'
            print('Get Run ..')
            return resp
    
        def post(self,request):
            print('POST Run ..')
            return self.lister(request)
    该花的钱要花,该吃的饭要吃。
  • 相关阅读:
    Thinking Clearly about Performance
    国家统计局2018-10-30统计的最新的省市区
    Java 返回字符串中第一个不重复字符的下标 下标从0开始
    国际象棋的游戏规则
    Python语言之requests库
    VBS 自动发消息给对方
    Windows
    上海合计共有16个区一个县
    @RequestMapping中的注解
    Linux 中 /proc/kcore为啥如此之大
  • 原文地址:https://www.cnblogs.com/chao666/p/12109972.html
Copyright © 2011-2022 走看看