当前位置: 首页 > news >正文

web前端学习FastAPI

1.简介

FastAPI是一个高性能的基于python3.8+的web框架,快速,高效,简单,标准化
https://fastapi.org.cn/tutorial/first-steps/

2.安装 本地测试

pip install fastapi
启动本地网关测试
在这里插入图片描述

uvicorn 是一个ASGI服务器组件来启动API
uvicorn helloworld:app --reload
直接在啊py文件中测试,在代码中测试
uvicorn.run(
“helloworld:app”,
reload=True
)

3.简单使用

from fastapi import FastAPIapp = FastAPI()@app.get('/')
async def hello2()->dict:return {"message":'hello_word'}
@app.get('/helloword')
async def hello()->str:return 'hello_word'

在这里插入图片描述
在这里插入图片描述

4.各种参数

1.get方法

@app.get('/')
async def hello2()->dict:return {"message":'hello_word'}
@app.get('/helloword')
async def hello()->str:return 'hello_word'# 各种参数 顺序很重要
# ----------------------------------------------------------------------
# 必须是int
@app.get('/use/current')
async def get_user()->dict:return {'message':'自己'}# ----------------------------------------------------------------------@app.get('/use/{use_id}')
# 必须是int
async def get_user(use_id:int)->dict:return {'message':use_id}# ----------------------------------------------------------------------# 在docs中参数可以选择
class Gender(str,Enum):male = '男'female = '女'
@app.get('/student/{sex}')
# 必须是int
async def get_user(sex:Gender)->dict:return {'message':f'性别:{sex.value}'}
# ----------------------------------------------------------------------
@app.get('/depart/getDepart',summary="获取部门信息", description="根据分页参数获取部门列表数据")
async def get_user(page:int,size:Optional[int] = 10)->dict:  #Optional 指定默认值 缺省值 = 默认值return {'message':f'分页参数{page},{size}'}# ----------------------------------------------------------------------
@app.get('/asd/{use_id}/friends',summary="中间的路径参数", description="中间的路径参数描述")
# 必须是int
async def get_user_friends(use_id:int,page:int,size:Optional[int] = 10)->dict:return {'message': f'分页参数{page},{size},路径参数{use_id}'}

2.post put delete patch方法

# post put delete patch方法 
#数据模型
class UserModel(BaseModel):username:strdescription:Optional[str] = 'default'gender:Optional[Gender] = '女'@app.post(path='/add/addUser',summary='添加用户',description='添加用户')
async def add_user(user_model:UserModel)->dict:print(user_model)# 将模型转换为字典(旧版本中使用dict()方法,model_dump()是新版本推荐用法)user_dict = user_model.model_dump()# user_dict = user_model.dict()return user_dict# ----------------------------------------------------------------------
class EditModel(BaseModel):username:strdescription:Optional[str] = 'default'gender:Optional[Gender] = '女'@app.put(path='/add/editUser/{user_id}',summary='修改用户',description='修改用户')
async def add_user(user_id:int,user_model:EditModel)->dict:print(user_model)# 将模型转换为字典(旧版本中使用dict()方法,model_dump()是新版本推荐用法)user_dict = user_model.model_dump()# user_dict = user_model.dict()user_dict.update({'id': user_id})return user_dict

5.参数验证

1.get路径参数 查询参数 验证

fastapi.Path
fastapi.Query

# ----------------------------------------------------------------------
# ----------------------------------------------------------------------
# ----------------------------------------------------------------------
# 参数验证
@app.get('/path/{use_id}',summary='path参数验证',description='路径参数验证')
# 必须是int
# title说明
# ge,le 大于等于 小于等于 或者gt 大于 lt小于
# ... = pass, 这里...意思是这个参数user_id是必选项
#min_length 字符串长度
#max_length 字符串长度
#regex = '^$' 正则表达式
#alias = 'xxxxxx'  别名 可以传alias名称 不可以用原来名称
async def get_user(use_id:int = Path(...,title='用户id',ge=1,le=10000))->dict:return {'message':use_id}@app.get('/query/xxxx',summary='query参数验证',description='查询参数验证')
# 必须是int
# title说明
# ge,le 大于等于 小于等于 或者gt 大于 lt小于
# ... = pass, 这里...意思是这个参数user_id是必选项 如果是第一个是值 代表是默认值 可选
#min_length 字符串长度
#max_length 字符串长度
#regex = '^$' 正则表达式
#alias = 'xxxxxx'  别名 可以传alias名称 不可以用原来名称
async def get_user(use_id:int = Query(1,title='用户id',ge=1,le=10000))->dict:return {'message':use_id}

2.请求体参数验证 post put delete

Field, Body

examples 推荐 username:str = Field(None,max_length=5,examples=[‘yang’])

# ----------------------------------------------------------------------
# ----------------------------------------------------------------------
# ----------------------------------------------------------------------
# 参数验证 post
class Item(BaseModel):name:str = Field(None,max_length=5)# name:Optional[str] = Field(None, max_length=3) # 非必填length:intsex:Gendermodel_config = {'json_schema_extra':{'examples':[{# 这里要包含所有字段 如果上面给了例子 优先这里的"name" : 'jie' ,'length':1}]}}
class User(BaseModel):username:str = Field(None,max_length=5,examples=['yang'])cxc:list[Item]description:Optional[str] = 'default'@app.put(path='/cart/{cart_id}',summary='修改用户',description='修改用户')
#Body 也支持验证 跟Path,Query差不多 add_user(*,xxx,xxx) *,代码把参数转为关键字参数,无法使用顺序参数
async def add_user(cart_id:int,user_model:User,item_model:Item,count:int=Body(...,examples=[2]))->dict:print(user_model)# 将模型转换为字典(旧版本中使用dict()方法,model_dump()是新版本推荐用法)user_dict = user_model.model_dump()user_dict1 = item_model.model_dump()result_dic = {"id": cart_id,**user_dict, **user_dict1}return result_dic

6.Cookie 和 Header

@app.put(path='/cookie',summary='cookie',description='cookie')
#Body 也支持验证 跟Path,Query差不多 add_user(*,xxx,xxx) *,代码把参数转为关键字参数,无法使用顺序参数
async def add_user11(*,response:Response,name_you:Optional[str] = Cookie(None,alias='name-you'),api_token:Union[str,None] = Header(None,alias='api-token')
)->dict:response.set_cookie(key='name-you',value='11111')result_dic = {"name_you": name_you,'api_token': api_token}return result_dic

7.响应模型

# ----------------------------------------------------------------------
# ----------------------------------------------------------------------
# ----------------------------------------------------------------------
# 响应模型users = {"x":{'id':0},"a": {'id': 0,'username':'a'},"b": {'id': 0, 'username': 'b','password':1111},"c": {'id': 0, 'username': 'c'},"e": {'id': 0, 'username': 'e'},
}
class UserOut(BaseModel):id:intusername:Optional[str] = ''password:Optional[int] = ''@app.get(path='/getUserName/{user_id}',summary='cookie',description='cookie',response_model=UserOut)
#Body 也支持验证 跟Path,Query差不多 add_user(*,xxx,xxx) *,代码把参数转为关键字参数,无法使用顺序参数
async def add_user11(user_id:str)->dict:return users.get(user_id)# response_model_include 只包含 response_model_include={'id'},
# response_model_exclude 除了xx其他的
# response_model_exclude_unset 如果没值 就不输出
@app.get(path='/getUserName1/{user_id}',summary='cookie',description='cookie',response_model=UserOut,response_model_exclude_unset=True)
#Body 也支持验证 跟Path,Query差不多 add_user(*,xxx,xxx) *,代码把参数转为关键字参数,无法使用顺序参数
async def add_user1(user_id:str)->dict:return users.get(user_id)@app.get(path='/getUserName2',summary='cookie',description='cookie',response_model=list[UserOut])
#Body 也支持验证 跟Path,Query差不多 add_user(*,xxx,xxx) *,代码把参数转为关键字参数,无法使用顺序参数
async def add_user22():return users.values()

7.状态码与异常处理

# ----------------------------------------------------------------------
# ----------------------------------------------------------------------
# ----------------------------------------------------------------------
# 状态码与异常处理
class UserBase(BaseModel):id:Optional[int] = Noneusername: strfullname: Optional[str] = Nonedes: Optional[str] = Noneclass UserIn(UserBase):password:strclass UserOut(UserBase):...@app.post(path='/create',status_code=201,response_model=UserOut)
#Body 也支持验证 跟Path,Query差不多 add_user(*,xxx,xxx) *,代码把参数转为关键字参数,无法使用顺序参数
async def create_user(user:UserIn):dic = user.model_dump()dic.update({"id":10})return dicpass@app.get(path='/create/{username}',status_code=200,response_model=UserOut)
#Body 也支持验证 跟Path,Query差不多 add_user(*,xxx,xxx) *,代码把参数转为关键字参数,无法使用顺序参数
async def create_user(username:str):user = users.get(username)if user:return userelse:raise  HTTPException(status_code=status.HTTP_404_NOT_FOUND,detail='找不到用户')return   JSONResponse(status_code=status.HTTP_404_NOT_FOUND,content=error_message.model_dump())

8.依赖注入

# ----------------------------------------------------------------------
# ----------------------------------------------------------------------
# ----------------------------------------------------------------------
# 依赖注入
# 代码复用
# app = FastAPI(dependencies=[Depends(verify_auth)]) 统一加
async def pageinfo_params(page:Optional[int] = 1,size:Optional[int] = 10):return {'page':page,'size':size}
async def pageinfo_total(total:Optional[int] = 100):return total
class PageInfo:def __init__(self,page:Optional[int] = 1,size:Optional[int] = 10,total:int = Depends(pageinfo_total)):self.page = pageself.size = sizeself.total = totalasync def verify_auth(api_token:Optional[str] = Header(None,alias='api-token')):if not api_token:raise HTTPException(status_code=400,detail='无权限访问')@app.get(path='/get_page_info')
#Body 也支持验证 跟Path,Query差不多 add_user(*,xxx,xxx) *,代码把参数转为关键字参数,无法使用顺序参数
async def get_page_info(page_info:dict=Depends(pageinfo_params)):return {'page': page_info.get('page'),'size': page_info.get('size'),}
@app.get(path='/get_page_info1')
#Body 也支持验证 跟Path,Query差不多 add_user(*,xxx,xxx) *,代码把参数转为关键字参数,无法使用顺序参数
async def get_page_info(page_info:PageInfo=Depends()):return {'page': page_info.page,'size': page_info.size,'total': page_info.total,}@app.get(path='/get_page_info2',dependencies=[Depends(verify_auth)])
#Body 也支持验证 跟Path,Query差不多 add_user(*,xxx,xxx) *,代码把参数转为关键字参数,无法使用顺序参数
async def get_page_info(page_info:PageInfo=Depends()):return {'page': page_info.page,'size': page_info.size,'total': page_info.total,}

9.身份验证

# ----------------------------------------------------------------------
# ----------------------------------------------------------------------
# ----------------------------------------------------------------------
# 身份验证 使用OAuth2进行身份验证
# pip install python-multipart==0.0.6
# pip install PyJWT==2.8.0 加密token
SECU_TOKE = 'asdjlkasjdalksjdlaksdjakllsjdaldjlajdladjals'
ALGORITHMS = 'HS256'
oauth2_scheme = OAuth2PasswordBearer(tokenUrl='/token')def validate_user(username:str,password:str):print(username,password)if username == 'jack' and password == '111':return usernamereturn None
@app.post('/token')
async def login(login_form:OAuth2PasswordRequestForm = Depends()):username = validate_user(login_form.username,login_form.password)print(username)if not username:raise HTTPException(status_code=401,detail='账号密码错误',headers={'www-Authenticate':'Bearer'})# 登陆后 30分钟有效期token_expires = datetime.now(timezone.utc) + timedelta(minutes=30)token_data = {'username':username,'exp':token_expires}token = jwt.encode(token_data,SECU_TOKE,ALGORITHMS)print(token)return {'access_token':token,'token_type':'bearer'}async def ver_token(token:str = Depends(oauth2_scheme)):# 解密print(token)token_data = jwt.decode(token, SECU_TOKE, ALGORITHMS)try:print(222)token_data = jwt.decode(token, SECU_TOKE, ALGORITHMS)username = Noneif token_data:username = token_data.get('username', None)except Exception as error:raise HTTPException(status_code=401,detail='toke无效')if not username:raise HTTPException(status_code=401, detail='toke无效')return username
@app.get('/toke/items') # dependencies=[Depends(ver_token) 只能知道过与不过 用不了数据
async def get_items(username:str = Depends(ver_token)):return username
http://www.dtcms.com/a/461358.html

相关文章:

  • 中级经济师:学习科目、考试科目、收益
  • 做网站如何不被忽悠网站制作的行业
  • 今天重大新闻50字大庆seo推广
  • (4)SwiftUI 基础(第四篇)
  • 全球独家支持CV云渲染!渲染101平台助力Vantage动画创作新飞跃
  • Linux中计时相关函数的实现
  • InterGEO2025 | 和芯星通发布UM98XC系列 全系统多频高精度RTK星基定位模块
  • Node.js 工具模块详解
  • k8s介绍和特性
  • 上海网站建设推网络营销方式整理
  • 软软一键开关 --提供多个 Windows 系统开关,例如保持常亮、隐藏桌面图标、显示器亮度、夜间模式等
  • C 数组:深入解析与高效应用
  • 牛客网_动态规划
  • 《边缘端工业系统的编程优化与性能突破》
  • Typescript中的Type check类型检查
  • 【2063】牛吃牧草
  • 网站开发专业优势吉林长春建设工程信息网站
  • 16. SPDK应用框架
  • 【2026计算机毕业设计】基于Jsp的校园勤工俭学兼职系统
  • ⸢ 柒-Ⅱ⸥ ⤳ 可信纵深防御建设方案:应用可信网络可信
  • 做棋牌游戏网站犯法吗网站建设公司咋样
  • 自己做网站怎么加定位seo首页排名优化
  • 华为NetEngine 8000 M1A路由器配置
  • 【C/C++】一篇小文速通 数据类型
  • 棱镜观察|极氪销量遇阻?千里智驾左手服务吉利、右手对标华为
  • 如何安全轻松地出售损坏的 iPhone(最新指南)
  • QT-常用控件(二)
  • React 源码揭秘 | 合成事件
  • 如何处理旧 iPhone:安全地回收或重新利用
  • 过年做那些网站能致富网页制作培训苏州