FastAPI.2

一、简单的编写基于fastapi的接口

  1. 创建main.py文件

  2. 导入fastapi

    from fastapi import FastAPI
    
  3. 实例化出FastAPI的对象

    app = FastAPI()
    
  4. 通过装饰器添加路径,

    @app.get("/")
    
    '''
    @app.get("/")的作用:告诉 FastAPI 在它下方的函数负责处理如下访问请求
    	请求路径:/
    	请求方式:get(也可以是post、put、delete、options、head、patch、trace)
    
    '''
    
  5. 返回内容

    # 写法一
    @app.get("/")
    def read_root():
        return {"hello": "world"}  # 定义返回的内容
    
    # 写法二
    @app.get("/")
    async def read_root():
        return {"hello": "world"}  # 定义返回的内容
    
    # 返回内容可以是dict,也可以是list, str、int 等都可以。
    
  6. 启动

    uvicorn main:app --reload
    
  7. 小结(六步开启fastapi)

    1. 导入 FastAPI。
    2. 创建一个 app 实例。
    3. 编写一个路径操作装饰器(如 @app.get("/"))
    4. 编写一个路径操作函数(如上面的 def root(): ...)
    5. 定义返回值
    6. 运行开发服务器(如 uvicorn main:app --reload)
    

二、请求路径

  1. 在请求路径中增加参数

    @app.get("/{name}")
    def read_root(name):
        return {"name": name}
    
  2. 指定参数类型

    @app.get("/{name}")
    def read_root(name:int):
        return {"name": name}
    
    # 如果携带的不是int类型,http://127.0.0.1:8000/zhang,就返回如下内容:
        "detail": [
            {
                "loc": [
                    "path",
                    "name"
                ],
                "msg": "value is not a valid integer",
                "type": "type_error.integer"
            }
        ]
    
  3. fastapi路由匹配是按顺序自上而下,如果上面的路由匹配到了不会执行下面的,所以在编写时一定要注意,相同匹配的时候,默认只会按顺序匹配

  4. 输入规定的数据,返回对应数据 --- 推荐枚举

    from enum import Enum
    
    
    class ModelName(str, Enum):
        zhang = '1'
        wang = '2'
    
    
    @app.get("/{name}")
    def name(name: ModelName):
        if name == '1':
            return "zhang"
        if name == '2':
            return "wang"
        
    ''' 
    http://127.0.0.1:8000/zhang 的返回结果如下: 
        "detail": [
            {
                "loc": [
                    "path",
                    "name"
                ],
                "msg": "value is not a valid enumeration member; permitted: '1', '2'",
                "type": "type_error.enum",
                "ctx": {
                    "enum_values": [
                        "1",
                        "2"
                    ]
                }
            }
    '''
    '''
    http://127.0.0.1:8000/1的返回结果如下:
    	"zhang"
    
    '''
    '''
    http://127.0.0.1:8000/2的返回结果如下:
    	"wang"
    
    '''
    
  5. 指定路由参数默认值

    # 此时请求不携带参数会报错
    @app.get("/items/")
    def read_item(start: int, end: int):
        return data[start:end]
    
    # 指定参数类型为int,不给值就默认start=0,end=2
    data=['北京','上海','深圳']
    @app.get("/items/")
    def read_item(start: int = 0, end: int = 2):
        return data[start:end]
    
    # 指定参数类型为int,不给end就默认为none,返回所有
    @app.get("/items/")
    def read_item(start: int = 0, end: Optional[int] =None):
        if end:
            return data[start:end]
        return  data[start:-1]
    
posted on 2023-04-21 17:48  zhangbinn  阅读(23)  评论(0编辑  收藏  举报