FastAPI(54)- 详解 Request 请求对象
背景
- 前面讲了可以自定义 Response,那么这里就讲下请求对象 Request
- 可以通过 Request 来获取一些数据
获取请求基础信息
@app.get("/base")
async def get_base(*, request: Request):
res = {
# 客户端连接的 host
"host": request.client.host,
# 客户端连接的端口号
"port": request.client.port,
# 请求方法
"method": request.method,
# 请求路径
"base_url": request.base_url,
# request headers
"headers": request.headers,
# request cookies
"cookies": request.cookies
}
return res
请求结果
{
"host": "127.0.0.1",
"port": 54364,
"method": "GET",
"base_url": {
"_url": "http://127.0.0.1:8080/"
},
"headers": {
"host": "127.0.0.1:8080",
"connection": "keep-alive",
"sec-ch-ua": "\"Chromium\";v=\"94\", \"Google Chrome\";v=\"94\", \";Not A Brand\";v=\"99\"",
"accept": "application/json",
"sec-ch-ua-mobile": "?0",
"user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36",
"sec-ch-ua-platform": "\"macOS\"",
"sec-fetch-site": "same-origin",
"sec-fetch-mode": "cors",
"sec-fetch-dest": "empty",
"referer": "http://127.0.0.1:8080/docs",
"accept-encoding": "gzip, deflate, br",
"accept-language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7,zh-TW;q=0.6",
"cookie": "test_token=tokenABC"
},
"cookies": {
"test_token": "tokenABC"
}
}
可以看到 port 并不是 8080
request.url 对象
from fastapi import Query
@app.get("/url/{item_id}")
async def get_url(*,
item_id: str,
name: str = Query(...),
request: Request):
res = {
# 请求 url
"url": request.url,
# 总的组成
"components": request.url.components,
# 请求协议
"scheme": request.url.scheme,
# 请求 host
"hostname": request.url.hostname,
# 请求端口
"url_port": request.url.port,
# 请求 path
"path": request.url.path,
# 请求查询参数
"query": request.url.query,
"fragment": request.url.fragment,
"password": request.url.password
}
return res
请求结果
{
"url": {
"_url": "http://127.0.0.1:8080/url/123?name=456",
"_components": [
"http",
"127.0.0.1:8080",
"/url/123",
"name=456",
""
]
},
"components": [
"http",
"127.0.0.1:8080",
"/url/123",
"name=456",
""
],
"scheme": "http",
"hostname": "127.0.0.1",
"url_port": 8080,
"path": "/url/123",
"query": "name=456",
"fragment": "",
"password": null
}
request.url 是一个对象(URL 类),得到的是一个字典
获取路径参数、查询参数
@app.get("/query_path/{item_id}")
async def get_all(*,
item_id: str,
name: str = Query(...),
request: Request):
res = {
# 获取路径参数
"path_params": request.path_params,
"item_id": request.path_params.get("item_id"),
# 获取查询参数
"query_params": request.query_params,
"name": request.query_params["name"]
}
return res
请求结果
{
"path_params": {
"item_id": "123"
},
"item_id": "123",
"query_params": {
"name": "小菠萝"
},
"name": "小菠萝"
}
path_params、query_params返回的都是字典格式的数据
获取表单数据
@app.post("/form")
async def get_form(*,
username: str = Form(...),
oassword: str = Form(...),
request: Request):
res = {
# 获取表单数据
"form": await request.form()
}
return res
请求结果
{
"form": {
"username": "name",
"oassword": "***"
}
}
获取 Request Body
class Item(BaseModel):
id: str
title: str @app.post("/body")
async def get_body(item: Item, request: Request):
res = {
# 获取 Request Body
"body": await request.json(),
"body_bytes": await request.body()
}
return res
请求结果
{
"body": {
"id": "string",
"title": "string"
},
"body_bytes": "{\n \"id\": \"string\",\n \"title\": \"string\"\n}"
}
.body() 返回值类型是 bytes
获取 Request 存储的附加信息
async def dep_state(request: Request):
# 给 request 存储附加数据
request.state.db = "Mysql+pymysql//username" @app.post("/state/", dependencies=[Depends(dep_state)])
async def get_state(request: Request):
res = {
"state": request.state,
"db": request.state.db
}
return res
请求结果
{
"state": {
"_state": {
"db": "Mysql+pymysql//username"
}
},
"db": "Mysql+pymysql//username"
}
获取文件上传信息
from fastapi import UploadFile, File, Form
@app.post("/file")
async def get_file(*,
file: UploadFile = File(...),
name: str = Form(...),
request: Request):
form_data = await request.form()
res = {
# 表单数据
"form": form_data,
# 文件对象 UploadFile
"file": form_data.get("file"),
# 文件名
"filename": form_data.get("file").filename,
# 文件类型
"content_type": form_data.get("file").content_type,
# 文件内容
"file_content": await form_data.get("file").read()
}
return res
请求结果
{
"form": {
"file": {
"filename": "test.txt",
"content_type": "text/plain",
"file": {}
},
"name": "表单name!!"
},
"file": {
"filename": "test.txt",
"content_type": "text/plain",
"file": {}
},
"filename": "test.txt",
"content_type": "text/plain",
"file_content": "hello world"
}
UploadFile 对象
- form_data.get("file") 返回的是一个 starlette.datastructures.UploadFile 对象
- filename、content_type 是对象实例属性
- .read() 是实例方法,读取文件
UploadFile 的其他异步方法
和 Python 普通的文件对象方法一样,只不过都是 async 异步的
- write
- read
- seek
- close

FastAPI(54)- 详解 Request 请求对象的更多相关文章
- TOMCAT原理详解及请求过程(转载)
转自https://www.cnblogs.com/hggen/p/6264475.html TOMCAT原理详解及请求过程 Tomcat: Tomcat是一个JSP/Servlet容器.其作为Ser ...
- 详解SpringMVC请求的时候是如何找到正确的Controller
详解SpringMVC请求的时候是如何找到正确的Controller[附带源码分析] 目录 前言 源码分析 重要接口介绍 SpringMVC初始化的时候做了什么 HandlerExecutionCha ...
- Java精通并发-自旋对于synchronized关键字的底层意义与价值分析以及互斥锁属性详解与Monitor对象特性解说【纯理论】
自旋对于synchronized关键字的底层意义与价值分析: 对于synchronized关键字的底层意义和价值分析,下面用纯理论的方式来对它进行阐述,自旋这个概念就会应运而生,还是很重要的,下面阐述 ...
- Servlet的学习之Request请求对象(3)
本篇接上一篇,将Servlet中的HttpServletRequest对象获取RequestDispatcher对象后能进行的[转发]forward功能和[包含]include功能介绍完. 首先来看R ...
- Servlet的学习之Request请求对象(2)
在上一篇<Servlet的学习(十)>中介绍了HttpServletRequest请求对象的一些常用方法,而从这篇起开始介绍和学习HttpServletRequest的常用功能. 使用Ht ...
- JSP内置九个对象Request请求对象
jsp内置对象是什么呢? 例如Java语言使用一个对象之前需要实例化(也就是所说的new一个对象),创建对象这个过程有点麻烦,所以在jsp中提供了一些内置对象,用来实现很多jsp应用.在使用内置对象时 ...
- c# 把一个匿名对象赋值给一个Object类型的变量后,怎么取这个变量? c# dynamic动态类型和匿名类 详解C# 匿名对象(匿名类型)、var、动态类型 dynamic 深入浅析C#中的var和dynamic
比如有一个匿名对象,var result =......Select( a=>new { id=a.id, name=a.name});然后Object obj = result ;我怎 ...
- opa gatekeeper笔记:AdmissionReview input.request请求对象结构
官方:https://v1-17.docs.kubernetes.io/zh/docs/reference/access-authn-authz/extensible-admission-contro ...
- ASP.NET 运行时详解 揭开请求过程神秘面纱
对于ASP.NET开发,排在前五的话题离不开请求生命周期.像什么Cache.身份认证.Role管理.Routing映射,微软到底在请求过程中干了哪些隐秘的事,现在是时候揭晓了.抛开乌云见晴天,接下来就 ...
随机推荐
- QT怎样插入图片
工具/原料 QT designer 方法/步骤 1 首先创建一个Manwindow窗口 拖一个label到窗口上 把文字去掉,然后把label放大 找到stylesheet一栏 ...
- IMO 1977 第 2 题探析
原题:在一个有限的实数数列中,任意 7 个连续项之和为负数,且任意 11 个连续项之和为正数.求这个数列最多有多少项. 解法一:记这个数列为 a1, a2, ..., ak,问题等价于求 k 的最大值 ...
- JavaScript——数组——数组长度
JavaScript--数组--数组长度 JavaScript中的数组长度是可变的,可用赋值运算符改变数组大小,如果改变之后的数组的长度比原数组大,则新数组会在末尾补充相应数量的空位,空位上的数组元素 ...
- GIS常用算法
目录 1.常用算法 1.1.计算两经纬度点之间的距离 1.2.根据已知线段以及到起点距离,求目标点坐标 1.3.已知点.线段,求垂足 1.4.线段上距离目标点最近的点 1.5.点缓冲 1.6.点和面关 ...
- 《Go语言圣经》阅读笔记:第三章基础数据类型
第三章 基础数据类型 Go语言将数据类型分为四类: 基础类型 数字 整数 浮点数 复数 字符串 布尔 复合类型 数据 结构体 引用类型 指针 切片 字典 函数 通道 接口类型 在此章节中先介绍基础类型 ...
- [源码解析] 深度学习流水线并行 PipeDream(5)--- 通信模块
[源码解析] 深度学习流水线并行 PipeDream(5)--- 通信模块 目录 [源码解析] 深度学习流水线并行 PipeDream(5)--- 通信模块 0x00 摘要 0x01 前言 0x02 ...
- Redis——set,hash与列表
一.List列表 基于Linked List实现 元素是字符串类型 列表头尾增删快,中间增删慢,增删元素是常态 元素可以重复出现 最多包含2^32-1元素 列表的索引 从左至右,从0开始 从右至左,从 ...
- Linux 文本相关命令(1)
Linux 文本相关命令(1) 前言 最近线上环境(Windows Server)出现了一些问题,需要分析一下日志.感觉 Windows 下缺少了一些 Linux 系统中的小工具,像在这波操作中用到的 ...
- HDU - 3790 最短路径问题 (dijkstra算法)
HDU - 3790 最短路径问题 Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费 ...
- PHP中的数组分页实现(非数据库)
在日常开发的业务环境中,我们一般都会使用 MySQL 语句来实现分页的功能.但是,往往也有些数据并不多,或者只是获取 PHP 中定义的一些数组数据时需要分页的功能.这时,我们其实不需要每次都去查询数据 ...