FastAPI Web框架教程 第11章 请求响应的进阶用法

11-1 直接使用Request对象

  • 关于请求的操作,比如从URL中提取路径参数,获取查询参数,获取请求头,获取Cookie,获取请求体中的数据;这些参数和值的获取非常方便,这是因为FastAPI帮我们创造便利。

  • FastAPI底层依赖Starlette,本质上是FastAPI帮我们做了一些操作,从Starlette的Request对象解析出上述各个参数。

  • 所以,对于上面这些常用的请求参数,我们可以直接使用FastAPI给我们提供的工具,并且有了数据校验、类型转化、OPenAPI文档等功能。

  • 当然了,你不使用FastAPI提供的便捷工具,直接从Request对象中解析数据也是可以的,但就没由数据校验、类型转化、OPenAPI文档等功能。

  • 不过,有些场景,比如说获取请求的IP,请求的client host等等,那我们就必须直接使用Request对象。

示例1:使用使用Request获取常见参数

from fastapi import FastAPI, Request
from starlette.requests import Requestapp = FastAPI()@app.get("/{item_id}")
def hello(req: Request):item_id = req.path_params.get("item_id")page = req.query_params.get("page", 0)size = req.query_params.get("size", 10)x_token = req.headers.get("x-token")x_token_cookie = req.cookies.get("x_token")return {"item_id": item_id,"page": page,"size": size,"x-token": x_token,"cookie": x_token_cookie,}

示例2:使用Request获取客户端host

  • 从fastapi导入 Request对象,或者直接从 starlette.requests导入 Request, 两者是一样的效果。
  • 本例中,路径参数 item_id是用的FastAPI提供的便捷方式,所以具有类型转换、类型校验、openapi文档等附加功能。
  • 第二个形参 req 的类型是 Request,那FastAPI就知道要直接从Request中获取参数,就没有上述附加功能。
from fastapi import FastAPI, Request
from starlette.requests import Request		app = FastAPI()@app.get("/item/{item_id}")
def hello(item_id: int, req: Request):return {"item_id": item_id,"client_host": req.client.host}

补充:直接从Request中获取请求体参数,需要使用async/await语法,在下一章我们再详细介绍。

11-2 直接使用Response对象

  • 关于响应的操作,在前面的章节有涉及到,比如设置响应状态码,设置响应头,在路径函数内返回数据就可以当做响应体。

  • 这些都是FastAPI给我们提供的便捷方式,使用了这些方式,几乎帮助我们处理了大部分常见的需求。

  • 不过,在一些特殊常场景下,我们需要更加灵活的处理响应。

  • 比如,我们已经使用过了,通过Response对象来设置Cookie, 设置响应头等等。

  • 本质上,FastAPI借用了Starlette框架的Response对象,即我们使用的Response对象都是Starlette的

  • Response对象还有很多其他高进的用法,比如处理重定向、响应其他格式的数据:纯文本/HTML/XML/下载文件等等

示例1:使用Response设置状态码/响应头/cookie

  • 从FastAPI导入的Response,等价于从starlette.responses导入的Response
  • 在路径函数中定义的形参response的类型是Response,FastAPI可以是被出来你要手动使用Response对象
  • 但是,这样的使用方式,本质上依然使用了FastAPI的便捷方式,因为你返回的是"123",但其实响应格式是"application/json"
  • 这是因为,FastAPI的默认响应方式是JSONResponse,即所有的返回给客户端的数据都会被json序列化
from fastapi import FastAPI, Response
from starlette.responses import Responseapp = FastAPI()@app.get("/")
def hello(response: Response):response.status_code = 201response.headers["x-token"] = "12345"response.set_cookie("token", "111111", 100)return "123"

示例2:直接返回Response对象

  • Response类初始化对象一般需要四个参数
  • content是响应体的数据,必须是支持编码的字符串。如果要返回的数据是字段,则要使用json序列化
  • status_code 设置响应的状态码
  • headers 设置响应头
  • media_type 设置响应类型,比如说是json格式的数据则值为 application/json
import json
from fastapi import FastAPI, Response
from starlette.responses import Responseapp = FastAPI()@app.get("/", )
def hello():response = Response(content=json.dumps({"hello": "world"}),status_code=201,headers={"x-token": "qqqqqq"},media_type="application/json")return response

11-3 默认响应方式

上节课我们知道,可以直接返回Response对象,使用起来也比较简单,只需要在实例化对象是按照要求传参即可。

但是你会发现,不同类型的响应数据,都需要手动传参,这是比较麻烦的。

其实,FastAPI提供了多种内置的响应方式,比如对于JSON格式的响应数据,提供了JSONResponse这种响应类型。

本质上JSONResponse类是Response这个类的子类,并且JSONResponse是FastAPI中的默认响应方式。

示例1:

  • 此时直接返回的是字典,但FastAPI内部帮我们处理,返回的数据格式是json的。
  • 想要修改内置响应方式,可修改FastAPI()中或的APIRouter()中的 default_response_class
  • 还可以对于指定接口,通过 response_class设置响应方式
  • 优先级:接口 > router > app
from fastapi import FastAPI, APIRouter
from fastapi.responses import JSONResponseapp = FastAPI(default_response_class=JSONResponse)			# 设置全局的默认响应方式
router = APIRouter(default_response_class=JSONResponse)		 # 设置APIRouter所有接口的默认响应方式@app.get("/", response_class=JSONResponse)					# 设置这个接口的默认响应方式
def hello():return {"id": 1, "name": "liixu"}

示例2:源码阅读

  • JSONResponse是Response的子类,m默认写死 media_type = "application/json"
  • 并重写了render方法,该方法会在示实例化响应对象时触发,用来把我们传进去的 content序列化。
  • 因此使用手动JSONResponse时需要保证content是可序列化的,否则报错。
class JSONResponse(Response):			media_type = "application/json"def __init__(self,content: typing.Any,status_code: int = 200,headers: typing.Optional[dict] = None,media_type: typing.Optional[str] = None,background: typing.Optional[BackgroundTask] = None,) -> None:super().__init__(content, status_code, headers, media_type, background)def render(self, content: typing.Any) -> bytes:return json.dumps(content,ensure_ascii=False,allow_nan=False,indent=None,separators=(",", ":"),).encode("utf-8")

11-4 文本相关的Response

和文本相关的有两种响应方式:

  • PlainTextResponse

  • HTMLResponse

示例1:PlainTextResponse用来响应纯文本的数据

  • PlainTextResponse是Response的子类,重写了media_type = “text/plain”,对应响应头中的 content-type: text/plain,此时网页上显示纯文本信息。
from fastapi import FastAPI
from fastapi.responses import PlainTextResponseapp = FastAPI()@app.get("/", response_class=PlainTextResponse)
def main():return "Hello World"

示例2:HTMLResponse用来响应HTML页面

  • HTMLResponse是Response的子类,重写media_type = “text/html”
  • 就可以直接返回HTMLResponse对象,网页渲染HTML样式。
from fastapi import FastAPI
from fastapi.responses import HTMLResponseapp = FastAPI()@app.get("/")
def index():html_content = """<html><head><title>Some HTML in here</title></head><body><h1>Look ma! HTML!</h1></body></html>"""return HTMLResponse(content=html_content, status_code=200)

示例3:使用response_class=HTMLResponse,此时可以直接返回HTML的文本,此时网页上依然渲染HTML样式。

  • 使用response_class=HTMLResponse的另一个好处是可以在openapi文档上显示返回HTML的提示。
from fastapi import FastAPI
from fastapi.responses import HTMLResponseapp = FastAPI()@app.get("/", response_class=HTMLResponse)
def index():return """<html><head><title>Some HTML in here</title></head><body><h1>Look ma! HTML!</h1></body></html>"""

11-5 下载文件相关的Response

下载文件相关的响应类有两个:

  • StreamingResponse
  • FileResponse

示例1:StreamingResponse支持文件类型的操作,下载文件

from fastapi import FastAPI
from fastapi.responses import StreamingResponseapp = FastAPI()@app.get("/")
def index():def iterfile():  #with open("mybook.zip", mode="rb") as f:  #yield from freturn StreamingResponse(iterfile(), media_type="application/zip")

示例2:使用FileResponse

  • 更加直接,时候文件下载。
from fastapi import FastAPI
from fastapi.responses import FileResponseapp = FastAPI()@app.get("/")
def index():return FileResponse("mybook.zip", filename="book.zip")	# 第一个参数文件路径,filename指定下载下来的文件名

11-6 其他Response

示例1:重定向Response

from fastapi import FastAPI
from fastapi.responses import RedirectResponseapp = FastAPI()@app.get("/")
def go_to_baidu():return RedirectResponse("https://www.baidu.com")

示例2:ORJSONResponse

  • ORJSONResponse是一个基于orjson序列化的响应类,它在性能上要由于JSONResponse
  • 使用是需要安装 pip3 install orjson
from fastapi import FastAPI
from fastapi.responses import ORJSONResponseapp = FastAPI()@app.get("/", response_class=ORJSONResponse)
def go_to_baidu():return {"id": 1, "name": "liuxu"}

补充:继承Response, 模仿者其他响应类,定义自己的响应类(自己实现吧)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/787825.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iOS系统文件路径解析:探索苹果手机中各类重要文件的存储位置

​ 目录 引言 用户登录工具和连接设备 查看设备信息&#xff0c;电池信息 查看硬盘信息 硬件信息 查看 基带信息 销售信息 电脑可对手机应用程序批量操作 运行APP和查看APP日志 IPA包安装测试 注意事项 引言 苹果手机与安卓手机不同&#xff0c;无法直接访问系统文件…

从《布瓦尔与佩库歇》实践中学习社会科学概论

从《布瓦尔与佩库歇》实践中学习社会科学概论 前情提要《布瓦尔与佩库歇》实践笔记云藏山鹰社会科学概论报告核心--信息形数身知™意合™意气实体过程意气实体过程宇宙学诠释™ 社会科学概论花间流风版导读&#xff0c;马斯克风格演讲[ 一尚韬竹团队供稿&#xff1b;] 内容展开…

音乐家马常旭当选为中华名人库委员会副主席

4月2日&#xff0c;据中华名人库官网显示&#xff0c;马常旭已当选为中华名人库委员会副主席。此前马常旭是一名音乐家、中国内地著名男歌手。 马常旭资料 马常旭&#xff0c;男&#xff0c;汉族&#xff0c;2002年10月生&#xff0c;辽宁大连人。现任中华名人库委员会副主席&…

数据结构第二版-陈越 第1章 概论

定义&#xff1a; 题或例子&#xff1a; 循环和递归两种方法 循环体不同

neutron 运维命令

OpenStack Neutron是OpenStack云计算平台的网络组件&#xff0c;负责管理和连接虚拟机&#xff08;VM&#xff09;和其他计算资源之间的网络。Neutron提供了一组API和插件&#xff0c;以便实现各种网络拓扑和服务&#xff0c;支持虚拟网络和物理网络的管理、配置和调度&#xf…

AtCoder Beginner Contest 347 (B,C,D,E)

B - Substring (atcoder.jp) 问题陈述 您将得到一个由小写英文字母组成的字符串 S 。 S 有多少不同的非空子字符串? 子字符串是一个连续子序列。例如&#xff0c; xxx 是 yxxx 的子字符串&#xff0c;但不是 xxyxx 的子字符串。 解析&#xff1a; 对于数据范围不超过100&…

vk-unicloud 框架 H5 浏览器无法登录访问 Client platform is h5, but web was found in config

最开始出现的bug 进入云函数查看日志 Client platform is h5, but web was found in config 把这个问题扔到百度是没有答案的&#xff0c;但是找到一个类似问题 &#xff1a;Client platform is app, but app-plus was found in config. 顺藤摸瓜到uniCloud的官方文档 关于pr…

MNN介绍安装编译详解

MNN是一个高效、轻量的深度学习框架&#xff0c;它支持深度模型的推理与训练&#xff0c;尤其在端侧的推理与训练性能在业界处于领先地位。MNN已经在阿里巴巴的多个App中使用&#xff0c;覆盖多个场景&#xff0c;同时在IoT等场景下也有若干应用。它支持TensorFlow、Caffe、ONN…

python coding with ChatGPT 专题2| 全解递归算法

文章目录 递归与栈的关系如何思考递归汉诺塔 经典题目入门&#xff1a;斐波那契数列分治法&#xff1a;归并排序树的递归遍历组合问题&#xff1a;子集搜索问题&#xff1a;N皇后 拓展阶乘的迭代法斐波那契数列迭代法青蛙跳 参考文献 掌握递归是解决许多编程问题的关键&#xf…

isaacgym 渲染黑屏

问题描述&#xff1a; isaacgym安装完IsaacGym_Preview_4_Package.tar.gz之后&#xff0c;运行python joint_monkey.py没有任何内容现实&#xff0c;但是终端还是正常输出信息。 环境是ubuntu22服务器&#xff0c;python3.8&#xff0c;nvidia Driver Version: 515.65.01 CUDA…

Google HTML/CSS 风格指南

1、Background 背景 本文档定义了 HTML 和 CSS 的格式和样式规则。它旨在 改善协作、代码质量并启用支持基础设施。 它适用于使用 HTML 和 CSS 的原始工作文件&#xff0c;包括 GSS 文件。 工具可以自由地混淆、缩小和编译&#xff0c;只要通用代码 保持质量。 2、常规 2.1、…

【JavaSE】解密 继承和多态(下)

前言 紧接着上篇 解密继承和多态&#xff08;上&#xff09;~ 欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 目录 前言 protected关键字 在同一包下同一类可以访问 代码理解 在同一包下不同类可以访问 代码理解 …

HarmonyOS 应用开发之LifecycleForm接口切换LifecycleApp接口切换 LifecycleApp接口切换

LifecycleForm接口切换 FA模型接口Stage模型接口对应d.ts文件Stage模型对应接口onCreate?(want: Want): formBindingData.FormBindingData;ohos.app.form.FormExtensionAbility.d.tsonAddForm(want: Want): formBindingData.FormBindingData;onCastToNormal?(formId: string…

蓝桥杯每日一题:壁画(前缀和)

题目描述&#xff1a; Thanh 想在一面被均分为 N 段的墙上画一幅精美的壁画。 每段墙面都有一个美观评分&#xff0c;这表示它的美观程度&#xff08;如果它的上面有画的话&#xff09;。 不幸的是&#xff0c;由于洪水泛滥&#xff0c;墙体开始崩溃&#xff0c;所以他需要加…

Octavia Venture 成立,打造数十亿美元规模的 AI 价值体系

​随着 OpenAI 相继发布 ChatGPT、Sora 等 AIGC 大模型后&#xff0c;AI 赛道的发展迎来了一轮又一轮的热潮&#xff0c;这也让极具想象力的 AI 赛道涌入大量资金&#xff0c;比如英伟达股票市值短时间内从 1 万亿美元暴涨至 2 万亿美元&#xff0c;就是最好的佐证。当然&#…

Linux ssh免密登录配置

步骤 在本地机器上生成公钥和私钥对。将本地公钥复制到远程机器的~/.ssh/authorized_keys文件中。 实现1 在服务器上生成SSH密钥对 ssh-keygen -t rsa -f /home/id_rsa1ssh-keygen: 这是一个用于生成、管理和转换 SSH 密钥的 OpenSSH 工具。-t rsa: 用于指定要生成的密钥类…

Memcached 教程之 Memcached replace 命令(七)

Memcached replace 命令用于替换已存在的 key(键) 的 value(数据值)。 如果 key 不存在&#xff0c;则替换失败&#xff0c;并且您将获得响应 NOT_STORED。 语法&#xff1a; replace 命令的基本语法格式如下&#xff1a; replace key flags exptime bytes [noreply] value…

Python学习:面相对象

面向对象 面向对象技术简介 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。方法:类中定义的函数。类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实…

【AI绘画/作图】风景背景类关键词模板参考

因为ds官网被墙,所以翻了IDE的源码整理了下stablestudio里的官方模板&#xff0c;顺便每个模板生成了一份…不知道怎么写关键词的可以参考 Stunning sunset over a futuristic city, with towering skyscrapers and flying vehicles, golden hour lighting and dramatic cloud…

《c++》多态案例一.电脑组装

一.代码展示 #include <iostream> using namespace std; class CPU { public://抽象计算函数virtual void calculate() 0;};class CVideoCard { public://抽象显示函数virtual void display() 0;}; class Memory { public://抽象存储函数virtual void storage() 0;};…