zoukankan      html  css  js  c++  java
  • Django框架——CBV及源码分析

    CBV (基于类的视图函数)

    代码示例:

    urls.py

    url(r'^login/',views.MyLogin.as_view())

    views.py

    from django.views import View
    
    class MyLogin(View):
        def get(self,request):
            print("from MyLogin get方法")
            return render(request,'login.html')
        def post(self,request):
            return HttpResponse("from MyLogin post方法")

    研究方向:

    1.从url进入

    url(r'^login/',views.MyLogin.as_view())

    由于函数名加括号执行优先级最高,所以这一句话一写完会立刻执行as_view()方法,返回view

    @classonlymethod
    def as_view(cls, **initkwargs):  # cls就是我们自己的写的类 MyLogin
        def view(request, *args, **kwargs):
            self = cls(**initkwargs)  # 实例化产生MyLogin的对象  self = MyLogin(**ininkwargs)
            if hasattr(self, 'get') and not hasattr(self, 'head'):
                  self.head = self.get
            self.request = request
            self.args = args
            self.kwargs = kwargs
            # 上面的几句话都仅仅是在给对象新增属性
            return self.dispatch(request, *args, **kwargs)  # dispatch返回什么 浏览器就会收到什么
            # 对象在查找属性或者方法的时候 你一定要默念 先从对象自己这里找  然后从产生对象的类里面找  最后类的父类依次往后
        return view

    通过源码发现url匹配关系可以变形成

    url(r'^login/',views.MyLogin.view)  # FBV和CBV在路由匹配上是一致的 都是url后面跟函数的内存地址

    2.当浏览器中输入login会立刻触发view函数的运行,走上面的view函数,再进入到dispatch方法

    def dispatch(self, request, *args, **kwargs):
        # Try to dispatch to the right method; if a method doesn't exist,
        # defer to the error handler. Also defer to the error handler if the
        # request method isn't on the approved list.
        # 我们先以GET为例
        if request.method.lower() in self.http_method_names:  # 判断当前请求方法是否在默认的八个方法内
            # 反射获取我们自己写的类产生的对象的属性或者方法
            # 以GET为例  request.method.lower()是get   handler = getattr(self,'get','取不到报错的信息')
            # handler = get(request)
            handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
        else:
            handler = self.http_method_not_allowed
        return handler(request, *args, **kwargs)  # 直接调用我们自己的写类里面的get方法
    # 源码中先通过判断请求方式是否符合默认的八个请求方法 然后通过反射获取到自定义类中的对应的方法执行

    通过获取对应的方法(get,post),然后执行view.py中对应的请求方法

    Django快速新建测试脚本

    1.随便新建一个test.py文件做测试文件

    2.写如下代码

    import os
    
    if __name__ == "__main__":
        os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysqltest.settings")    #前面这几行是从manage.py复制的
    import django django.setup()

  • 相关阅读:
    从spring官网下载spring 架包
    bootstrap-dialog插件的使用
    underscore.js,js工具库
    datatables,表格
    formvalidation表单验证
    数字千分位处理,number.js,js保留两位,整数强制保留两位小数
    js精确计算
    django F和Q 关键字使用
    django 的多对多关系
    django中的一对一的关系
  • 原文地址:https://www.cnblogs.com/wangcuican/p/12246050.html
Copyright © 2011-2022 走看看