Cookie
Cookie是在网站中为了辨别用户身份,进行Session跟踪而存储在用户本地终端上的数据(通常已经加密),由用户客户端计算机暂时或永久保存的信息。
设置Cookie
通常客户端首次访问服务端的时候,服务端都会向客户端发送一些Cookie信息,让客户端电脑中存储这些信息。
在fastapi中服务端向客户端设置cookie需要使用到Response类。
from typing import Union
from fastapi import FastAPI
app = FastAPI()
# 声明一个用户类的请求体类型
from pydantic import BaseModel
class User(BaseModel):
userName:str
pwd:str
# 导入fastapi中的Response类用来设置cookie
from fastapi import Response
@app.post("/register/")
def createUser(user:User,response:Response):
response.set_cookie(key="userName",value=user.userName)
response.set_cookie(key="pwd",value=user.pwd)
return {"result":"register successfully"}
if __name__ == "__main__":
import uvicorn
uvicorn.run(app="main:app",host="localhost",port=8080,reload=True)
本例中通过客户端向服务端发送注册请求后,服务端向客户端发送两个cookie。
利用postman演示结果如下:
读取cookie信息
当客户端首次访问后,客户端往往就存储了cookie信息。后面再访问服务端时,服务端会读取客户端中的相关cookie信息。
fastapi中读取cookie信息,需要从fastapi包中引入Cookie函数。
# 演示服务端从客户端读取cookie信息
# 导入fastapi中的Cookie函数用来表示cookie
from fastapi import Cookie
@app.get("/items/{item_id}")
# 此处需要注意cookie定义的名称需要和客户端中cookie的key的名称一致!!!
def get_items(item_id:int,userName:Union[str,None]=Cookie(default=None),pwd:Union[str,None]=Cookie(default=None)):
return {
"item_id":item_id,
"userName":userName,
"pwd":pwd
}
在读取客户端中Cookie时需要注意,代码中cookie的变量名称必须和客户端cookie中的key值一致!!!
在postman中测试的结果如下:
Header
在请求头中包含很多客户端请求的一些额外说明,例如user-agent,content-type等信息。
请求头中的数据也是以键值对的形式存储的。所以当我们想获取某个key的请求体内容时,我们必须要设置对应的key的变量名称来接收请求头内容。
在fastapi中需要导入Header函数来接收请求头参数。
读取单值请求头数据
# 演示获取请求头的相关信息
# 导入fastapi中的Header函数用来表示header
from fastapi import Header
@app.get("/demo")
# 由于正常请求头中key的命名是这样的User-Agent,如何以这个作为变量名python认为是非法的变量命名
# 由于这种冲突fastapi中会将user_agent当做User-Agent。
# 如果不想使用这种默认的解决冲突方式需要,在Header函数中使用convert_underscores=False
def demo(user_agent:Union[str,None]=Header(None,convert_underscores=True),postman_token:Union[str,None]=Header(None)):
return{
"User-Agent":user_agent,
"Postman-Token":postman_token
}
此处需要知道Header函数中convert_underscores参数的含义
此例的演示结果如下:
获取多值请求头数据
当获取多值请求头数据时,需要将相应的请求头对应的变量的类型设置为列表类型。
# 演示获取一个请求头具有多个值的情况
# 要获取多个值的请求头信息,需要将对应的请求头变量的类型设置为列表类型
from typing import List
@app.get("/demos")
def demos(x_token:Union[List[str],None]=Header(default=None,convert_underscores=True)):
return {
"X-Token":x_token
}
演示结果如下图所示: