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的本质是基于函数的视图

原文地址:https://www.cnblogs.com/liubailiang/p/11493923.html