当客户端访问服务器,进行了一个http请求,也就是用户访问了一个url时,发生了如下的事情:
如果是以GET方法请求(请求时要用到的数据放在url路径里),Django会从url中取出访问时所需的数据,可以通过request.GET字典操作
如果以POST方法请求(请求时要用到的数据放在请求体里),Django会从请求体里取出访问时所需的数据,可以通过request.POST字典操作
request.POST虽然是一个字典,但是其本源是request.body,reqeust.body是原生的请求体,是字符串,request.POST是在request.body的基础上处理得到的
经过上述操作之后,Django再通过url正则进行匹配,匹配顺序从上到下,第一次匹配成功后即执行对应视图函数,就不再匹配,所以写url时要注意写$符号,以免出现后续问题
上述的Http请求,被WSGI封装,传给了视图函数中的那个必须要有的参数:request
这种路由对应视图函数的模式成为FBV模式
还有一种路由对应类的模式称为CBV模式,在views的类中定义一些方法,在类中Django为我们提供了get和post两个方法名,Django去找http请求头中的请求方法,如果以GET方式请求,则自动触发类中的get方法,POST方式触发post方法,但前提是views中的类要继承django.views中的View类才可以这样使用
而且在写url时,要在类后面加as_view()方法,例如:views.类名.as_view()
关于触发类中的get与post方法,具体流程如下:CBV中的类要继承views.View类,而View里有一个dispatch方法,此方法的功能是判断请求字符串中的method是GET还是POST,从而去调用views.py中的类对应的方法。由于每次执行一次CBV形式的从路由到类的映射,就会以反射的方式调用一次这个dispatch方法,所以在views.py中的子类里重写父类View中的dispatch方法,就可以实现一些额外的每一次操作都需要有的功能,比如每次登录都要验证等等