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

相关文章

Debezium 与 Apache Kafka 的集成方式步骤详解

《Debezium与ApacheKafka的集成方式步骤详解》本文详细介绍了如何将Debezium与ApacheKafka集成,包括集成概述、步骤、注意事项等,通过KafkaConnect,D... 目录一、集成概述二、集成步骤1. 准备 Kafka 环境2. 配置 Kafka Connect3. 安装 D

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

SQL 中多表查询的常见连接方式详解

《SQL中多表查询的常见连接方式详解》本文介绍SQL中多表查询的常见连接方式,包括内连接(INNERJOIN)、左连接(LEFTJOIN)、右连接(RIGHTJOIN)、全外连接(FULLOUTER... 目录一、连接类型图表(ASCII 形式)二、前置代码(创建示例表)三、连接方式代码示例1. 内连接(I

Android里面的Service种类以及启动方式

《Android里面的Service种类以及启动方式》Android中的Service分为前台服务和后台服务,前台服务需要亮身份牌并显示通知,后台服务则有启动方式选择,包括startService和b... 目录一句话总结:一、Service 的两种类型:1. 前台服务(必须亮身份牌)2. 后台服务(偷偷干

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

JS 实现复制到剪贴板的几种方式小结

《JS实现复制到剪贴板的几种方式小结》本文主要介绍了JS实现复制到剪贴板的几种方式小结,包括ClipboardAPI和document.execCommand这两种方法,具有一定的参考价值,感兴趣的... 目录一、Clipboard API相关属性方法二、document.execCommand优点:缺点:

Python创建Excel的4种方式小结

《Python创建Excel的4种方式小结》这篇文章主要为大家详细介绍了Python中创建Excel的4种常见方式,文中的示例代码简洁易懂,具有一定的参考价值,感兴趣的小伙伴可以学习一下... 目录库的安装代码1——pandas代码2——openpyxl代码3——xlsxwriterwww.cppcns.c