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线程之线程的创建、属性、回收、退出、取消方式

《Linux线程之线程的创建、属性、回收、退出、取消方式》文章总结了线程管理核心知识:线程号唯一、创建方式、属性设置(如分离状态与栈大小)、回收机制(join/detach)、退出方法(返回/pthr... 目录1. 线程号2. 线程的创建3. 线程属性4. 线程的回收5. 线程的退出6. 线程的取消7.

golang程序打包成脚本部署到Linux系统方式

《golang程序打包成脚本部署到Linux系统方式》Golang程序通过本地编译(设置GOOS为linux生成无后缀二进制文件),上传至Linux服务器后赋权执行,使用nohup命令实现后台运行,完... 目录本地编译golang程序上传Golang二进制文件到linux服务器总结本地编译Golang程序

Linux下删除乱码文件和目录的实现方式

《Linux下删除乱码文件和目录的实现方式》:本文主要介绍Linux下删除乱码文件和目录的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux下删除乱码文件和目录方法1方法2总结Linux下删除乱码文件和目录方法1使用ls -i命令找到文件或目录

Linux在线解压jar包的实现方式

《Linux在线解压jar包的实现方式》:本文主要介绍Linux在线解压jar包的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux在线解压jar包解压 jar包的步骤总结Linux在线解压jar包在 Centos 中解压 jar 包可以使用 u

Jenkins分布式集群配置方式

《Jenkins分布式集群配置方式》:本文主要介绍Jenkins分布式集群配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1.安装jenkins2.配置集群总结Jenkins是一个开源项目,它提供了一个容易使用的持续集成系统,并且提供了大量的plugin满

Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys

C#读写文本文件的多种方式详解

《C#读写文本文件的多种方式详解》这篇文章主要为大家详细介绍了C#中各种常用的文件读写方式,包括文本文件,二进制文件、CSV文件、JSON文件等,有需要的小伙伴可以参考一下... 目录一、文本文件读写1. 使用 File 类的静态方法2. 使用 StreamReader 和 StreamWriter二、二进

JavaSE正则表达式用法总结大全

《JavaSE正则表达式用法总结大全》正则表达式就是由一些特定的字符组成,代表的是一个规则,:本文主要介绍JavaSE正则表达式用法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录常用的正则表达式匹配符正则表China编程达式常用的类Pattern类Matcher类PatternSynta

java实现docker镜像上传到harbor仓库的方式

《java实现docker镜像上传到harbor仓库的方式》:本文主要介绍java实现docker镜像上传到harbor仓库的方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 前 言2. 编写工具类2.1 引入依赖包2.2 使用当前服务器的docker环境推送镜像2.2

springboot项目打jar制作成镜像并指定配置文件位置方式

《springboot项目打jar制作成镜像并指定配置文件位置方式》:本文主要介绍springboot项目打jar制作成镜像并指定配置文件位置方式,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录一、上传jar到服务器二、编写dockerfile三、新建对应配置文件所存放的数据卷目录四、将配置文