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