基于类的视图对编写RESTful API 比 视图函数 更加方便,在代码层面也更清晰。

下面是个人对基于类的视图浅薄认识,如有不对的地方,还望高台贵手指点一下,抱拳!

示例:

    @classonlymethod    def as_view(cls, **initkwargs):        """Main entry point for a request-response process."""        for key in initkwargs:            # 判断as_view()方法 传入的参数是不是与请求方法重名了,如果重名了抛出异常            if key in cls.http_method_names:  # http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']                raise TypeError(                    'The method name %s is not accepted as a keyword argument '                    'to %s().' % (key, cls.__name__)                )            # 判断类是否有定义 传入的属性,如果没有定义,那么抛出异常            if not hasattr(cls, key):                raise TypeError("%s() received an invalid keyword %r. as_view "                                "only accepts arguments that are already "                                "attributes of the class." % (cls.__name__, key))        def view(request, *args, **kwargs):            self = cls(**initkwargs)  # 对当前类进行实例化            self.setup(request, *args, **kwargs)  # 设置实例request/arg/kwarg 属性            if not hasattr(self, 'request'):  # 如果实例没有request属性,则抛出异常                raise AttributeError(                    "%s instance has no 'request' attribute. Did you override "                    "setup() and forget to call super()?" % cls.__name__                )            return self.dispatch(request, *args, **kwargs)  # 根据实例的请求方法 来调用类中定义的method函数,如果类中没有定义 则抛出异常        view.view_class = cls        view.view_initkwargs = initkwargs        # take name and docstring from class        update_wrapper(view, cls, updated=())        # and possible attributes set by decorators        # like csrf_exempt from dispatch        update_wrapper(view, cls.dispatch, assigned=())        return view

简单解读:

1.判断参数是否合法   a.参数是否跟http的method命名重复     b.视图类是否已手工定义了相关的属性2.对视图类进行实例化,判断是否浏览器的请求方法,是否有(视图类是否有定义GET、POST之类的方法),然后返回一个视图函数。

如果给test_class_view.as_view()方法传递参数,那么这个参数必须是test_class_view这个实现了的属性:

class test_class_view(View):    def get(self, request):        return HttpResponse("类视图")    test_key = None  # 如果as_view() 传入test_key关键字参数,类中必须定义

如果视图类中不定义as_view()传入的参数对应同名属性:

©著作权归作者所有:来自51CTO博客作者J4ck0r的原创作品,如需转载,请注明出处,否则将追究法律责任

你的鼓励让我更有动力

赞赏

0人进行了赞赏支持

更多相关文章

  1. 210427 PHP 运算符 流程控制 字符串定义 定界符 require/include
  2. Django 使用正则匹配URL 并将匹配成功的值传递给视图函数
  3. 【Vue框架学习】过滤器、自定义指令、生命周期、动画、组件、路
  4. 孙卫琴的《精通JPA与Hibernate》的读书笔记:映射Bag包(值类型的集
  5. 4.14 vSphere许可术语和定义
  6. 【PostgreSQL技巧】PostgreSQL中的物化视图与汇总表比较
  7. 如何在定义局部变量时赋初始值
  8. 学 Win32 汇编[31] - 结构与联合
  9. laravel框架入门和基本使用(一)

随机推荐

  1. android UI小知识点
  2. Android BufferQueue原理分析
  3. 缓存
  4. 分享20个Android游戏源码,希望大家喜欢哈!
  5. android显示PNG图片背景黑色问题 ImageVi
  6. Android(安卓)APP跳转微信小程序和APP跳
  7. android 环境搭建 windows 和linux 环境
  8. android loader用法
  9. Android P SystemUI之StatusBar Wifi图标
  10. Android判断输入是否只包含数字并且执行