本文主要是介绍django的requet请求传参方式总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
django request请求传参方式
- 1.URL路径参数传参
- 2. Django中的QueryDict对象传参
- 3. 查询字符串Query String传参
- 4. 请求体传参
- 4.1 表单类型 Form Data传参
- 4.2 非表单类型 Non-Form Data传参
- 5. 请求头传参
- 6.其他常用HttpRequest对象属性
回想一下,利用HTTP协议向服务器传参有几种途径?
1.提取URL的特定部分,如/weather/beijing/2018,可以在服务器端的路由中用正则表达式截取;
2.查询字符串(query string),形如?key1=value1&key2=value2;
3.请求体(body)中发送的数据,比如表单数据、json、xml;
4.在http报文的头(header)中。
1.URL路径参数传参
在定义路由URL时,可以使用正则表达式提取参数的方法从URL中获取请求参数,Django会将提取的参数直接传递到视图的传入参数中。
未命名参数按定义顺序传递, 如:
urls.py文件中
url(r'^weather/([a-z]+)/(\d{4})/$', views.weather),views.py文件中:
def weather(request, city, year):print('city=%s' % city)print('year=%s' % year)return HttpResponse('OK')
路径中的第一个参数传入视图的第一个参数, 路径中的第二个参数传入视图的第二个参数…
命名参数按名字传递,如:
urls.py 文件中
url(r'^weather/(?P<city>[a-z]+)/(?P<year>\d{4})/$', views.weather),views.py文件中
def weather(request, year, city):print('city=%s' % city)print('year=%s' % year)return HttpResponse('OK')
路劲传参已经命名后, 在视图中形参的位置可以随意填写,类似于python的关键字传参形式.
2. Django中的QueryDict对象传参
定义在django.http.QueryDict
HttpRequest对象的属性GET、POST都是QueryDict类型的对象
与python字典不同,QueryDict类型的对象用来处理同一个键带有多个值的情况
方法get():根据键获取值
如果一个键同时拥有多个值将获取最后一个值
如果键不存在则返回None值,可以设置默认值进行后续处
dict.get('键',默认值)
可简写为
dict['键']
值的注意的是,使用get()方法获取dict中某个键对应的值时, 如果这个键不存在,我们可以给它设置默认值,如果不设置默认值,那默认的默认值就是None,
但是使用 dict[“键”]这种方式获取某个键对应的值时,如果这个键不存在,代码会直接报错.
后端服务一般是不允许报错的,所有建议大家尽量使用get()方法.
方法getlist():根据键获取值,值以列表返回,可以获取指定键的所有值
如果键不存在则返回空列表[],可以设置默认值进行后续处理
dict.getlist('键',默认值)
3. 查询字符串Query String传参
获取请求路径中的查询字符串参数(形如?k1=v1&k2=v2),可以通过request.GET属性获取,返回QueryDict对象
也可以使用request.params获取.拿到dict对象以后再用.get(“键”)的方法获取某个键对应的值.在实际项目中很少用request.GET,一般都是直接用request.params.get(“键”)一次性取到位.
# /qs/?a=1&b=2&a=3def qs(request):a = request.GET.get('a')b = request.GET.get('b')alist = request.GET.getlist('a')print(a) # 3print(b) # 2print(alist) # ['1', '3']return HttpResponse('OK')
重要:查询字符串不区分请求方式,即假使客户端进行POST方式的请求,依然可以通过request.GET获取请求中的查询字符串数据。
4. 请求体传参
请求体数据格式不固定,可以是表单类型字符串,可以是JSON字符串,可以是XML字符串,应区别对待。
可以发送请求体数据的请求方式有POST、PUT、PATCH、DELETE。
Django默认开启了CSRF防护,会对上述请求方式进行CSRF防护验证,在测试时可以关闭CSRF防护机制,方法为在settings.py文件中注释掉CSRF中间件,如:
4.1 表单类型 Form Data传参
前端发送的表单类型的请求体数据,可以通过request.POST属性获取,返回QueryDict对象。
def get_body(request):a = request.POST.get('a')b = request.POST.get('b')alist = request.POST.getlist('a')print(a)print(b)print(alist)return HttpResponse('OK')
也可以使用request.data的方式获取.一般情况下,request.data这种使用方式会比较多,但是需要注意的是,request.data中的数据不能直接修改,修改后代码会报错.
例如我们接受到前端传递的request.data后想要在requet.data中添加一些数据再进行serializer序列化(DRF中的内容).这时候,我们一般会这么写:
def create(self, request, *args, **kwargs):data = request.data.dict()data['name'] = '张三'serializer = self.get_serializer(data=data)
感觉像是脱裤子放屁,多此一举,但是现实就是这么残酷,不这么写不行,代码会报错.
重要:request.POST只能用来获取POST方式的请求体表单数据。
4.2 非表单类型 Non-Form Data传参
非表单类型的请求体数据,Django无法自动解析,可以通过request.body属性获取最原始的请求体数据,自己按照请求体格式(JSON、XML等)进行解析。request.body返回bytes类型。
例如要获取请求体中的如下JSON数据, 可以进行如下方法操作:
请求数据
{"a": 1, "b": 2}处理方式:
import jsondef get_body_json(request):json_str = request.bodyjson_str = json_str.decode() # python3.6 无需执行此步req_data = json.loads(json_str)print(req_data['a'])print(req_data['b'])return HttpResponse('OK')
当然,觉得麻烦的话,可以直接这么写:
请求数据
{"a": 1, "b": 2}处理方式:
import jsondef get_body_json(request):data = json.loads(request.body)print(req_data['a'])print(req_data['b'])return HttpResponse('OK')
5. 请求头传参
可以通过request.META属性获取请求头headers中的数据,request.META为字典类型。
常见的请求头如:
1.CONTENT_LENGTH – The length of the request body (as a string).
2.CONTENT_TYPE – The MIME type of the request body.
3.HTTP_ACCEPT – Acceptable content types for the response.
4.HTTP_ACCEPT_ENCODING – Acceptable encodings for the response.
5.HTTP_ACCEPT_LANGUAGE – Acceptable languages for the response.
6.HTTP_HOST – The HTTP Host header sent by the client.
7.HTTP_REFERER – The referring page, if any
8.HTTP_USER_AGENT – The client’s user-agent string.
9.QUERY_STRING – The query string, as a single (unparsed) string.
10.REMOTE_ADDR – The IP address of the client.
11.REMOTE_HOST – The hostname of the client.
12.REMOTE_USER – The user authenticated by the Web server, if any.
13.REQUEST_METHOD – A string such as “GET” or “POST”.
14.SERVER_NAME – The hostname of the server.
15.SERVER_PORT – The port of the server (as a string).
具体使用如:
def get_headers(request):print(request.META['CONTENT_TYPE'])return HttpResponse('OK')
6.其他常用HttpRequest对象属性
1.method:一个字符串,表示请求使用的HTTP方法,常用值包括:‘GET’、‘POST’。
2.user:请求的用户对象。
3.path:一个字符串,表示请求的页面的完整路径,不包含域名和参数部分。
4.encoding:一个字符串,表示提交的数据的编码方式。
如果为None,表示使用浏览器的默认设置,一般为utf-8。
这个属性是可写的,可以通过修改它来修改访问表单数据使用的编码,接下来对属性的任何访问将使用新的encoding值。
5.FILES:一个类似于字典的对象,包含所有的上传文件。
这篇关于django的requet请求传参方式总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!