FastAPI学习笔记

FastAPI框架

一个现代,快速的框架,很支持异步

优点:快速,开发效率高,简单简短,标准化

http协议

沟通的双方是客户端(浏览器)和服务器,客户端通过URL地址基于协议访问服务器,服务器基于协议将相应内容返回给客户端,基于TCP/IP协议,请求-相应模式,无状态保存(服务器无记录),

API接口

前后端不分离和前后端分离

前后端分离模式下后端只是对外提供统一的API,根据前端发出的请求进行操作后返回某种格式(如JSON)的数据,而不进行对页面的处理

API接口是应用程序对外提供的一个入口,可以是一个函数/类方法,可以是一个URL地址/网络地址

resful规范

是一种API接口的设计风格,适用于前后端分离模式,面向资源开发,路径一样,基于不同请求进行增删改查等操作

请求方式:POST,GET,PUT,SELECT,DELETE


 

基本格式

from fastapi import FASTAPI

app = FASTAPI()
@app.get("/")#路径操作装饰器
#路由映射,根目录
async def home():#路径函数
   return{"user-id":1001}#返回JSON格式

基本流程:导入FASTAPI,创建app实例,编写路径操作装饰器,编写路径函数,返回定义值,运行

命令行模式下运行:uvicorn 文件名:app --reload

if __name__ == "__main__":
   uvicorn.run("文件名:app",host=127.0.0.1,port=端口号,reload=True)

加入上述代码在最后可以直接运行

接口文档可以通过在浏览器网址127.0.0.1:端口号/docs查看


 

路径操作

路径操作装饰器方法

put,post,delete,patch,options,head,trace

路径操作装饰器参数

@app.put("/item",参数)

参数包括例如:

tags=[""]添加一个标题,是一个列表

summary=""添加一个概述总结

description=""添加一个详细描述

respondse_description=""添加一个响应

deprecated=True/False,分别表示此接口正常用和此接口废弃

include_router路由分发

from fastapi import APIRouter
shop = APIRouter()
@shop.put("/shop/food")
async def shop_food():
   return{"shop":"food"}
from fastapi import APIRouter
user = APIRouter()
@user.put("/user/login")
async def user_login():
   return{"user":"login"}
from 文件1 import shop
from 文件2 import user

app = FastAPI()
app.include_router(shop,prefix="/shop",参数等)
app.include_router(user,prefix="/user",参数等)

按照以上类似操作就可以分成两类接口,分模块开发


 

请求与相应

路径参数和查询参数之间是用?隔开

路径参数

@app.get("/user/{id}")
async def get_user(id):#async def get_user(id:int):
   return{
       "user_id":id
  }

这段代码中的id就是一个路径参数,在docs文档中会出现一个需要填id的输入来查询

注意:在路径中传送的任何参数都是字符型,想要响应得到其他类型可以在进行转换,但是转换后输入的值只能是对应的类型

路径匹配是有顺序的,在输入同一个值出现了两种对应的响应值时,按照顺序优先相应第一个

所以如果把小范围的路径放在大范围的路径的下面,上面的路径会覆盖下面的路径

查询参数

在路径函数中声明不属于路径函数的其他参数时,这些参数就会被自动解释为“查询字符串”参数,用&分隔开,key-value键值对

@app.get("/user/{id}")
async def get_user(id,name):
   return{
       "user_id":id
       "name":name
  }

上述代码中的name就是 查询参数

查询参数和路径参数可以同时使用

如果想要某个查询参数可填可不填,可以把它设置为可选参数(name:none)

Union

想要某一个变量可以是某两个类型中的一个,使用union

from typing import Union
@app.get("/user/{id}")
async def get_user(id,name:Union[str,None]):
return{
      "user_id":id
      "name":name
  }

之后修改为某一种类型还可以name:Union[str,None] = None或者Optional[str] = None,效果一样

请求体数据

FastAPI基于Pyantic,Pyantic主要用来做类型强制检查(数据校验)

Postman发送数据之后会进行一个数据校验,查看类型是否符合

from pydantic import BaseModel
from datetime import date
class User(BaseModer):
   name:str
   age:int
   birth:date
@app.post("/data")
async def data(user:User):
   return user

类型不一致不一定报错,可能会强制转换,4转换不了才会报错

类型还可以是List[int]等类型

class内可以设置限制,比如:

name:str = "hello"设置默认值

age:int = Field(default=0,gt=0,lt=100)限制在0到100之间

Union,Optional也同样适用

限制时也可以用正则表达式进行限制

Cookie参数

与查询参数和路径参数类似

from fastapi import Cookie, FastAPI
app = FastAPI()
@app.get("/items/")
async def read_items(*,
   ads_id: str = Cookie(None)
):
   return {"ads_id": ads_id}

之前使用的用来验证路径参数和查询参数的方法,Cookie参数也同样适用

Header参数

与查询参数和路径参数类似

from fastapi import FastAPI, Header
app = FastAPI()
@app.get("/items/")
async def read_items(*, user_agent: str = Header(None)):
   return {"User-Agent": user_agent}

之前使用的用来验证路径参数和查询参数的方法,Header参数也同样适用

在声明上述两种参数时要用对应的方法,否在就会被解释为查询参数

form表单数据

请求体数据有JSON和form表单两种格式

from fastapi import FastAPI, Form
app = FastAPI()
@app.post("/login")
async def login(username: str = Form(), password: str = Form()):
    return {"username": username}

先要安装组件:pip install python-multipart

posted @   .时云  阅读(147)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示