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

相关文章

Python中logging模块用法示例总结

《Python中logging模块用法示例总结》在Python中logging模块是一个强大的日志记录工具,它允许用户将程序运行期间产生的日志信息输出到控制台或者写入到文件中,:本文主要介绍Pyt... 目录前言一. 基本使用1. 五种日志等级2.  设置报告等级3. 自定义格式4. C语言风格的格式化方法

SpringBoot 获取请求参数的常用注解及用法

《SpringBoot获取请求参数的常用注解及用法》SpringBoot通过@RequestParam、@PathVariable等注解支持从HTTP请求中获取参数,涵盖查询、路径、请求体、头、C... 目录SpringBoot 提供了多种注解来方便地从 HTTP 请求中获取参数以下是主要的注解及其用法:1

HTTP 与 SpringBoot 参数提交与接收协议方式

《HTTP与SpringBoot参数提交与接收协议方式》HTTP参数提交方式包括URL查询、表单、JSON/XML、路径变量、头部、Cookie、GraphQL、WebSocket和SSE,依据... 目录HTTP 协议支持多种参数提交方式,主要取决于请求方法(Method)和内容类型(Content-Ty

Spring 依赖注入与循环依赖总结

《Spring依赖注入与循环依赖总结》这篇文章给大家介绍Spring依赖注入与循环依赖总结篇,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. Spring 三级缓存解决循环依赖1. 创建UserService原始对象2. 将原始对象包装成工

SpringBoot请求参数传递与接收示例详解

《SpringBoot请求参数传递与接收示例详解》本文给大家介绍SpringBoot请求参数传递与接收示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋... 目录I. 基础参数传递i.查询参数(Query Parameters)ii.路径参数(Path Va

使用shardingsphere实现mysql数据库分片方式

《使用shardingsphere实现mysql数据库分片方式》本文介绍如何使用ShardingSphere-JDBC在SpringBoot中实现MySQL水平分库,涵盖分片策略、路由算法及零侵入配置... 目录一、ShardingSphere 简介1.1 对比1.2 核心概念1.3 Sharding-Sp

使用Python的requests库来发送HTTP请求的操作指南

《使用Python的requests库来发送HTTP请求的操作指南》使用Python的requests库发送HTTP请求是非常简单和直观的,requests库提供了丰富的API,可以发送各种类型的HT... 目录前言1. 安装 requests 库2. 发送 GET 请求3. 发送 POST 请求4. 发送

Spring创建Bean的八种主要方式详解

《Spring创建Bean的八种主要方式详解》Spring(尤其是SpringBoot)提供了多种方式来让容器创建和管理Bean,@Component、@Configuration+@Bean、@En... 目录引言一、Spring 创建 Bean 的 8 种主要方式1. @Component 及其衍生注解

python中的显式声明类型参数使用方式

《python中的显式声明类型参数使用方式》文章探讨了Python3.10+版本中类型注解的使用,指出FastAPI官方示例强调显式声明参数类型,通过|操作符替代Union/Optional,可提升代... 目录背景python函数显式声明的类型汇总基本类型集合类型Optional and Union(py

MySQL中查询和展示LONGBLOB类型数据的技巧总结

《MySQL中查询和展示LONGBLOB类型数据的技巧总结》在MySQL中LONGBLOB是一种二进制大对象(BLOB)数据类型,用于存储大量的二进制数据,:本文主要介绍MySQL中查询和展示LO... 目录前言1. 查询 LONGBLOB 数据的大小2. 查询并展示 LONGBLOB 数据2.1 转换为十