zoukankan      html  css  js  c++  java
  • view视图

    Django中的视图就是一个简单的pyhton函数(类)

    FBV:基于函数的视图

      函数必须至少有一个参数用来接收请求的所有信息,处理请求,然后返回一个HttpResponse对象

    def index(request):
        if request.method == 'GET':
            return render(request, 'index.html')
        else:
            username = request.POST.get('username')
            # 数据库相关操作
            return redirect('http://www.baidu.com')

    CBV:基于类的视图

    自定义类视图必须继承 django.views.View

    类的实例有request属性封装了所有请求的信息 --> self.request

     

    view.py中代码

    from django.views import View
    class add_student(View):
        def get(self):
            return render(self.request,'add_students.html')
        
        def post(self):
            name = self.request.POST.get('name')
            pwd = self.request.POST.get('password')
            return redirect('/students/')

    urls中设置路由

    url(r'add_student/', app02_views.AddStudent.as_view()),

      原理

      1.Django项目启动时,urls中的视图类AddStudent首先会执行as_view()方法,返回view的函数对象

    def as_view(cls, **initkwargs):
    # 中间省略部分代码
    def view(request, *args, **kwargs): self = cls(**initkwargs) 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)
           # 中间省略部分代码
    return view

        2.当有请求发送时,路由匹配到对应的路由信息,执行view()函数,并自动将请求的所有信息封装成request对象传入view函数中

        3.view()函数最后是返回self.dispatch()函数的执行结果

        4.dispatch()函数内部通过对request.method的方法进行反射,获取到对应请求实例对象的方法handler(get/post/put/patch/delete),然后执行对应的对象的方法--->handler(request) 本质仍是基于函数的视图

    http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']
    
            if request.method.lower() in self.http_method_names:
                handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
            else:
                handler = self.http_method_not_allowed
            return handler(request, *args, **kwargs)

     本质:

        CBV的本质是基于函数的视图

  • 相关阅读:
    PAT甲级——A1148 WerewolfSimpleVersion【20】
    kruskal算法【最小生成树2】
    prim算法【最小生成树1】
    最小生成树
    关键路径详解
    「日常训练&知识学习」树的直径(POJ-1849,Two)
    「日常训练」Balancing Act(POJ-1655)
    「日常训练」Duff in the Army (Codeforces Round #326 Div.2 E)
    「题目代码」P1054~P1059(Java)
    「日常训练」All Friends(POJ-2989)
  • 原文地址:https://www.cnblogs.com/liubailiang/p/11493923.html
Copyright © 2011-2022 走看看