FastAPI请求处理与Cookie机制详解
文章目录
注在学习本篇文章之前请先学习FastAPI入门实战:从零搭建到核心功能详解
前言
Web开发的核心在于处理请求与维持状态。本文从FastAPI的Request对象出发,详解请求头读取、参数获取的实用技巧,并深入剖析Cookie的工作原理。无论你是刚入门的新手,还是想系统梳理知识点的开发者,都能在这里找到清晰的答案。
一、request请求
1.1 什么是request请求
用户打开浏览器访问网站时,浏览器会向服务器发送一条消息。这条消息就是request请求。它里面包含了用户想干什么、带了什么数据、用什么方式访问等信息。
服务器收到这条消息后,会查看里面的内容,然后决定返回什么给用户。
1.2获取Content-Type请求头信息的两种方法
请求头里面放了很多辅助信息。比如用户的浏览器类型、想要接收什么格式的数据、身份验证的令牌等。
1.2.1 直接通过字典方式获取(不推荐)
这种方式像查字典一样,直接用中括号取值。但如果请求头里没有这个字段,程序会直接报错。
from fastapi import APIRouter, Request, Response
request_router = APIRouter()
@request_router.get("/header/")
async def get_request_header(request: Request):
# 获取Content-Type请求头的头信息
# Content-Type是HeaderName(头名)
# 如果请求头中没有该头信息Content-Type,则会抛出异常
content_type = request.headers["Content-Type"]
return {"Content-Type": content_type}
代码详解
-
使用字典的索引访问方式
request.headers["Content-Type"] -
当请求头种不存在“Content-Type”时,会抛出
KeyError异常这会导致API响应
500 Internal Server Error异常
1.2.2 通过get方法获取(推荐)
这种方式更安全。如果请求头里没有这个字段,它会返回None,程序不会崩溃。
from fastapi import APIRouter, Request, Response
request_router = APIRouter()
@request_router.get("/header/2/")
async def get_request_header_2(request: Request):
# 获取Content-Type请求头的头信息
# Content-Type是HeaderName(头名)
# 如果请求头中没有该头信息Content-Type,则会返回None
content_type = request.headers.get("Content-Type")
user_agent = request.headers.get("User-Agent")
return {"Content-Type": content_type, "User-Agent": user_agent}
代码详解
- 使用字典的
get()方法request.headers.get("Content-Type") - 当请求头中不存在“Content-Type”时,返回
None
不会抛出异常,API会正常响应 - 可以提供默认值:
request.headers.get("Content-Type","application/json")
1.3 request请求三种获取参数的方法
用户传数据给服务器,通常有三种方式。这些方式对应URL的不同部分。
1.3.1 第一种:路径参数
路径参数写在URL里面,是URL路径的一部分。比如 /path_params/张三。
from fastapi import APIRouter, Request, Response
request_router = APIRouter()
@request_router.get("/path_params/{name}")
async def get_path_params(request: Request):
# 获取路径参数 path_params
name = request.path_params.get("name")
return {"name": name}
1.3.2 第二种:查询参数
查询参数跟在问号后面,用键值对的形式。比如 /?name=张三。
from fastapi import APIRouter, Request, Response
request_router = APIRouter()
@request_router.get("/params/")
async def get_request_params(request: Request):
# 获取请求参数 query_params
name = request.query_params.get("name")
return {"name": name}
1.3.3 第三种:请求体参数
请求体放在POST或PUT请求里面,通常是JSON格式的数据。获取请求体需要用到await,因为读取数据是异步操作。
from fastapi import APIRouter, Request, Response
request_router = APIRouter()
@request_router.post("/body/")
async def get_request_body(request: Request):
# 获取请求体 body
# body_data = await request.body()
# print(body_data)
# return {"body_data": body_data}
# 获取请求体 body,推荐使用json方法
body_data = await request.json()
return {"body_data": body_data}
二、什么是Cookie
2.1 什么是Cookie
Cookie是服务器放在用户浏览器里的一小段文字。这段文字可以保存用户的身份标识、偏好设置等信息。
下次用户在访问网站时,浏览器会自动带上这段文字。服务器看到这段文字,就能认出这个用户是谁。
2.2 Cookie的原理是什么
HTTP协议本身不保存状态。这意味着服务器记不住用户之前做过什么。但网站经常需要记住用户,比如记住登录状态。Cookie解决了这个问题。
它的工作流程如下:
2.2.1 第一步:服务器创建Cookie
用户第一次访问时,服务器生成一个唯一的编号。这个编号就是SessionID。服务器把这个编码存到数据库里,同时把它发给用户的浏览器。
2.2.2 浏览器保存Cookie
浏览器收到这个编号后,把它存到本地。这就是Cookie。
2.2.3 浏览器自动发送Cookie
用户下次访问时,浏览器会自动把这个编号发送给服务器。服务器检查这个编号,就能知道用户是谁。

注:这种构架设计还存在一些问题:
服务器为每个用户创建独立的线程对象,并分配不同的SessionID。这样不同用户的数据就不会混在一起。如果用户太多,服务器内存可能不够用,这时可以用Redis等工具来存Session数据。
2.3 添加Cookie
服务器通过Response对象把Cookie发给浏览器。可以设置Cookie的名字、值、有效期等。
from fastapi import APIRouter, Request, Response
request_router = APIRouter()
@request_router.post("/cookie/set")
async def set_cookie(response: Response):
# 获取Cookie
# Cookie是HeaderName(头名)
# 如果请求头中没有该头信息Cookie,则会返回None
response.set_cookie("session_id", "123456", max_age=60)
return {"message": "cookie set"}
2.4 获取Cookie
浏览器再次访问时,会自动带上之前保存的Cookie。服务器通过Request对象可以读取这些Cookie。
from fastapi import APIRouter, Request, Response
request_router = APIRouter()
@request_router.get("/cookie/get")
async def get_cookie(request: Request):
# 获取Cookie
# Cookie是HeaderName(头名)
# 如果请求头中没有该头信息Cookie,则会返回None
session_id = request.cookies.get("session_id")
return {"message": "cookie get","session_id": session_id}
结语
掌握Request与Cookie,你就掌握了Web开发的两大基石。前者让你读懂用户的每一次请求,后者让你记住用户的每一次到访。把这些知识串起来,你就能构建出真正可用的Web服务。继续实践,继续探索,下一篇文章我们再见。
更多推荐
所有评论(0)