django的requet请求传参方式总结

2023-11-10 06:50

本文主要是介绍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请求传参方式总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/381057

相关文章

Linux给磁盘扩容(LVM方式)的方法实现

《Linux给磁盘扩容(LVM方式)的方法实现》本文主要介绍了Linux给磁盘扩容(LVM方式)的方法实现,涵盖PV/VG/LV概念及操作步骤,具有一定的参考价值,感兴趣的可以了解一下... 目录1 概念2 实战2.1 相关基础命令2.2 开始给LVM扩容2.3 总结最近测试性能,在本地打数据时,发现磁盘空

java对接第三方接口的三种实现方式

《java对接第三方接口的三种实现方式》:本文主要介绍java对接第三方接口的三种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录HttpURLConnection调用方法CloseableHttpClient调用RestTemplate调用总结在日常工作

windows和Linux安装Jmeter与简单使用方式

《windows和Linux安装Jmeter与简单使用方式》:本文主要介绍windows和Linux安装Jmeter与简单使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录Windows和linux安装Jmeter与简单使用一、下载安装包二、JDK安装1.windows设

CSS 样式表的四种应用方式及css注释的应用小结

《CSS样式表的四种应用方式及css注释的应用小结》:本文主要介绍了CSS样式表的四种应用方式及css注释的应用小结,本文通过实例代码给大家介绍的非常详细,详细内容请阅读本文,希望能对你有所帮助... 一、外部 css(推荐方式)定义:将 CSS 代码保存为独立的 .css 文件,通过 <link> 标签

SpringCloud整合MQ实现消息总线服务方式

《SpringCloud整合MQ实现消息总线服务方式》:本文主要介绍SpringCloud整合MQ实现消息总线服务方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、背景介绍二、方案实践三、升级版总结一、背景介绍每当修改配置文件内容,如果需要客户端也同步更新,

Java实例化对象的​7种方式详解

《Java实例化对象的​7种方式详解》在Java中,实例化对象的方式有多种,具体取决于场景需求和设计模式,本文整理了7种常用的方法,文中的示例代码讲解详细,有需要的可以了解下... 目录1. ​new 关键字(直接构造)​2. ​反射(Reflection)​​3. ​克隆(Clone)​​4. ​反序列化

linux服务之NIS账户管理服务方式

《linux服务之NIS账户管理服务方式》:本文主要介绍linux服务之NIS账户管理服务方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、所需要的软件二、服务器配置1、安装 NIS 服务2、设定 NIS 的域名 (NIS domain name)3、修改主

使用Nginx配置文件服务器方式

《使用Nginx配置文件服务器方式》:本文主要介绍使用Nginx配置文件服务器方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 为什么选择 Nginx 作为文件服务器?2. 环境准备3. 配置 Nginx 文件服务器4. 将文件放入服务器目录5. 启动 N

使用nohup和--remove-source-files在后台运行rsync并记录日志方式

《使用nohup和--remove-source-files在后台运行rsync并记录日志方式》:本文主要介绍使用nohup和--remove-source-files在后台运行rsync并记录日... 目录一、什么是 --remove-source-files?二、示例命令三、命令详解1. nohup2.

MySQL Workbench工具导出导入数据库方式

《MySQLWorkbench工具导出导入数据库方式》:本文主要介绍MySQLWorkbench工具导出导入数据库方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录mysql Workbench工具导出导入数据库第一步 www.chinasem.cn数据库导出第二步