一、在Django函数视图中,request是一个必传参数,那么request参数到底是什么?
首先使用print函数打印一下request,可以看到request是一个WSGIRequest对象,然后使用__mro__来查看其继承关系,发现request实际上是HttpRequest对象
打断点调试,查看request对象中包含了哪些数据,可以看到request中包含了请求的所有信息
二、前端传递不同参数,如何从request对象中获取?
首先,需要清楚前端传递参数的类型有哪些:路径参数、查询字符串参数、请求体参数(json、www-form-urlencoded、form-data、binary)、请求头参数
1、路径参数
1)url路径中传递的参数,如:projects/2/ 中的2即为路径参数
2)在函数视图中通过同名位置参数来接收即可,如:pk
2、查询字符串参数
1) url路径中?后面的key=value参数,如:projects/?name=xx&leader=ppd 中的name和leader即为查询字符串参数
2)使用request.GET获取
值得注意的是:
1)request.GET返回的是QueryDict,类似python的Dict类型,但不是Dict,获取QueryDict的value,可以使用request.GET["key"] 或 request.GET.get("key")
2)当查询字符串参数的key有多个value时,如:projects/?name=xx&name=yy,使用request.GET["key"] 或 request.GET.get("key")获取的是最后一个value值即“hh”,此时,可以使用request.GET.getlist("key")获取name所有的value值组成的列表(注:dict是不支持getlist方法的)
3、请求体参数:
1)json:请求体中json格式的参数,一般是bytes类型,content-type 为 application/json
使用 request.body 获取
注意:request.body返回的是bytes类型,需要使用json.loads()转换为字典类型,即json.loads(request.body)
2)www-form-urlencoded:请求体中form表单参数,只能是key-value形式,一般是在前端页面中使用表单录入的参数,content-type为application/www-form-urlencoded
有两种获取表单参数的方式:1?? request.POST,此种方式返回的是QueryDict 2?? request.body,此种方式返回的是bytes类型
注意:一般情况下使用 request.POST 获取表单参数,而不用 request.body 获取
3)form-data:请求体中form-data参数,可以是key-value形式,也可以是二进制数据(视频/文件/图片),content-type 为 multipart/data
解析前端传递的form-data参数:1?? 当传递的是纯文本参数(key-value)时,使用 request.POST 获取,返回的是QueryDict;2?? 当传递的是二进制数据时,使用 request.FILES 获取,返回的是文件流(可以打开衣柜文件,将获取的文件流写入即可)
4)file(binary):请求体中传递的二进制数据(文件/视频/图片)
可以使用 request.body 获取
4、请求头参数:即在请求头中传递的参数
获取方式有两种:1)使用request.headers["key"] 或 request.headers.get("key") 获取
2)使用request.META["转化后的key"]
转化后的key = HTTP_ + key大写(注意:如果key中含有-,则-会被转化为_,所以请求头参数中不能包含下划线,否则解析时会出错)
注意:一般情况下使用第二种获取方式
特别说明:META中存储的是所有请求的元数据信息