前言
最常见的http请求method,是get和post方式,除此之外还有head\option\delete\put\patch等方式。默认输入url的请求方式即为get,当请求方式为get时,若带有需要传递的其他参数,则会将该参数的name和value补充在url中一并提交,post方式则将数据放在内容中一并提交,不再url中显示。在浏览器发送的request数据包的header中,可以看到这些内容,例如:
那么在django中,是如何获取这些请求的方式和如何定义处理这些请求的呢?现在来分析上一节( Django(一)、基本使用)的内容。
一、FBV方式处理请求
模板页面:
1 |
|
1 | def login_test(request): |
客户端的请求,作为实参传递给形参request,request.method可以获取该请求header中的method方式,reques.POST.get(‘info’)可以获取客户端通过POST方式传递过来的name为info的key对应的value。
在urls.py中绑定该函数1
url(r'^index_test/', enginetest_views.index_test),
打开http://127.0.0.1:8000//login_test/
默认如下:
输入任意值点击提交后如下:
TIPS:当前端为复选框,向后端Django传递的值有多个时,可以通过request.POST[GET].getlist(‘KEY’)的方式,获取值的数组,格式为[VALUE1,VALUE2..]
以上使用的是函数绑定url,即FBV(function base view)方式处理请求,url绑定放在views.py文件中的函数,绑定的写法为:路径→函数,url(r’^login/‘, common_view.login)
同时,django支持CBV(class base view)方式处理请求。
二、CBV的方式处理请求
views.py中的类写法:
1 | from django.views import View #引入django View父类 |
urls.py绑定写法:1
2# url(r'^login_test/', enginetest_views.login_test),
url(r'login_test/',enginetest_views.Login_test.as_view()) //将上方注释,替换为此句
实现效果和上方FBV一致。
原理介绍:
1 | ''' |
使用CBV,可以自定义或插入添加一些功能,例如简单修改View.dispatch方法,在接收到请求和回应请求之后分别输出打印:
1 | class Login_test(View): |
在客户端访问http://127.0.0.1:8000/login_test/时,查看console的输出,可以看到记录:
1 | ****,recv request |
总结:
FBV和CBV两种方式没有孰优孰劣,只是CBV方式有着更高的自定义性,可以实现更多的功能。