FastAPI自定义接口参数

文章展示了如何在FastAPI中定义接口,包括POST和GET方法。使用了BaseModel创建参数类Item,处理接口所需的参数,同时利用Query装饰器处理GET请求的可选参数。通过uvicorn运行服务,并提供了使用requests库进行接口调用的示例。

fastapi接口定义:

  1. 首先需要定义一个参数类Item,其只有一些基本属性,代表接口所需要的各个参数,继承Basemodel是为了更方便的处理参数,如将参数转化成字典或json类型;如果参数较少,可以不用特地封装一个类,可以参考test_next_api接口,Optional[]的作用是为可选参数限定类型,Query()的作用可以自行了解,参考连接如下:
    Query: FastAPI入门篇一Query参数与字符串验证
  2. 启动fastapi服务:uvicorn模块是一个基于asyncio开发的一个轻量高效的web服务器框架,使用起来比较方便
import uvicorn
import json
from fastapi import FastAPI
app = FastAPI()
# ----------------fastapi接口定义----------------
class Item(BaseModel):  # 定义一个参数类
    name: str
    age: int
    message: dict

@app.post("/testapi")
def send_message(info: Item):
    result = {
            "code": "",
            "message": "",
            "error": None,
            "data": ""
        }
    try:
        print(f'收到参数:{info}')
        print(info.name)
        print(info.age)
        cases = info.message
        case1 = cases['case1']
        print(case1['round'])
        result["code"] = "0000"
        result["message"] = "成功接收参数"
        result["data"] = info
    except Exception as e:
        result["code"] = "0001"
        result["message"] = "未接收到参数"
        result["error"] = f'{e}'
    # indent表示缩进为4,ensure_ascii=False防止中文乱码
    return json.dumps(result, indent=4, ensure_ascii=False)  

@app.get("/test_bext_api")
def next_api(pc_status: bool = Query(...),
             pc_ip: Optional[str] = None):
    print(pc_status)
    print(pc_ip)
    return 'ok'

if __name__ == "__main__":
    uvicorn.run(app, host='127.0.0.1', port=8000)  # 启动服务

访问服务器接口

  1. 请求参数较少时,可以直接将参数放在url中
  2. 请求参数较多时,根据我们自定义的参数类来定义参数类型,以json格式发送
import requests
import json
import socket

# ----------------访问接口----------------
if __name__ == "__main__":
    #test_next_api接口
    pc_ip = socket.gethostbyname(socket.gethostname())  # 获取PC自身ip的方法
    get_url = f'http://127.0.0.1:8000/test_next_api'
    get_resp = requests.get(f'{url}?pc_status=1&pc_ip={pc_ip}').content
    print(get_resp)

    # testapi接口
    p = {'name': 'aaa', 
             'age': 3, 
             'message': {
                 'case1': {
                     'round': 500, 
                     'delay_time': 60
                 }, 
                 'case2': {
                     'round': 400, 
                     'delay_time': 90
                 }
             }
        }

    url = f"http://127.0.0.1:8000/testapi"
    param = json.dumps(p)
    headers = {'content-type': 'application/json'}
    resp = requests.post(url, data=param, headers=headers).json
    print(json.loads(resp))  # 返回的结果也是json类型

<think>首先,用户的问题是:“我想查找使用FastAPI编写接口的例子 请问FastAPI编写接口的示例”。意思是用户想要查找使用FastAPI编写接口的例子,并请求提供示例。 根据系统指令: - 所有行内数学表达式必须使用$...$格式。 - 独立公式使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 在回答中引用的段落末尾自然地添加引用标识,例如[^1]。 用户提供了几个引用,我需要参考这些引用: - 引用[1]:关于如何将函数改造成API的FastAPI使用教程。 - 引用[2]:关于使用FastAPI开发AI服务接口。 - 引用[3]:提供了一些FastAPI接口的代码示例。 - 引用[4]:关于构建高性能异步接口服务的完整项目示例。 - 引用[5]:关于FastAPI接口文档的认证示例。 用户说“引用仅供参考,并不是用户真正的需求”,但我应该尽可能参考用户上一次的问题和我的回答。在对话历史中,用户上一次的问题是“我想查找使用FastAPI编写接口的例子”,所以这是我的第一次回应。 我的回答需要: - 结构清晰,帮助用户逐步解决问题。 - 保证回答真实可靠。 - 使用中文。 - 生成相关问题。 结构: - 我应该提供一个清晰的解释或步骤。 - 包括代码示例,因为用户要求例子。 - 参考提供的引用来支持我的回答。 - 在末尾生成相关问题。 关键内容是编写FastAPI接口的示例。从引用[3]中,有一个代码片段: ``` from fastapi import FastAPI, Query app = FastAPI() @app.post("/路由") def hello(): return {"Hello": "World"} @app.post('/路由') async def function( try: * except: * return {'Hello': World} ``` 但引用[3]中的代码有错误或不完整(例如,try-except块没有内容,return语句有错误)。 引用[5]中有一个更完整的认证示例: ``` from typing import Union import uvicorn from fastapi import Depends, FastAPI from fastapi.security import OAuth2PasswordBearer from pydantic import BaseModel app = FastAPI() oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token") class User(BaseModel): username: str email: Union[str, None] = None full_name: Union[str, None] = None disabled: Union[bool, None] = None def fake_decode_token(token): return User( username=token + "fakedecoded", email="john@example.com", full_name="John Doe" ) async def get_current_user(token: str = Depends(oauth2_scheme)): user = fake_decode_token(token) return user @app.get("/users/me") async def read_users_me(current_user: User = Depends(get_current_user)): return current_user if __name__ == '__main__': uvicorn.run(app,) ``` 我应该提供一个简单而完整的FastAPI接口示例。既然用户要求“编写接口的例子”,我可以从一个基础GET请求开始。 一个好的基础示例是创建一个简单的API端点: - 导入FastAPI。 - 创建一个app实例。 - 定义一个路由和处理函数。 - 返回JSON响应。 例如: ```python from fastapi import FastAPI app = FastAPI() @app.get("/") def read_root(): return {"Hello": "World"} @app.get("/items/{item_id}") def read_item(item_id: int, q: str = None): return {"item_id": item_id, "q": q} ``` 这是一个标准示例,类似于引用[3]中的第一个部分。 为了参考引用,我自然地添加引用标识。例如: - 对于基本示例,可以参考引用[3]。 - 对于认证部分,参考引用[5]。 回答结构: 1. 简要介绍FastAPI接口编写。 2. 提供一个简单的示例代码。 3. 解释代码的关键部分。 4. 提供更多资源或进阶例子。 5. 生成相关问题。 确保使用中文。 最后,生成相关问题,如指令所示:在末尾添加“§§相关问题§§”后列出一些问题。 相关问题可以基于主题,如: 1. 如何添加认证到FastAPI接口? 2. FastAPI如何处理异步请求? 3. 如何部署FastAPI应用? 现在,构建回答。 </think>### FastAPI 编写接口的示例 FastAPI 是一个构建 Web API 的高性能 Python 框架,支持异步操作、自动生成文档(如 Swagger UI),并基于类型提示提供高效开发。下面我将逐步介绍一个基础的 FastAPI 接口编写示例,包括一个简单的 GET 接口和一个带参数的 POST 接口。示例基于引用中的代码片段进行优化和扩展,确保语法正确且易于理解[^3][^4]。 #### 步骤 1: 安装 FastAPI 和依赖 在开始编写接口前,需要安装 FastAPI 和 Uvicorn(用于运行服务)。执行以下命令: ```bash pip install fastapi uvicorn ``` 这对应于引用中提到的依赖安装步骤[^1]。 #### 步骤 2: 创建基础的接口示例 下面是一个完整的 Python 脚本(例如 `main.py`),包含两个接口: - **GET 接口**:返回欢迎消息。 - **POST 接口**:接受 JSON 数据,处理并返回结果。 ```python from fastapi import FastAPI from pydantic import BaseModel # 用于定义数据模型 # 创建 FastAPI 应用实例 app = FastAPI() # 定义 POST 接口的数据模型(基于 Pydantic) class Item(BaseModel): name: str price: float is_offer: bool = None # 可选参数 # 示例 1: GET 接口 (路径 "/") @app.get("/") async def read_root(): return {"message": "欢迎使用 FastAPI 接口服务!"} # 示例 2: POST 接口 (路径 "/items/") @app.post("/items/") async def create_item(item: Item): # 处理数据:例如,增加折扣逻辑 if item.is_offer: discounted_price = item.price * 0.9 else: discounted_price = item.price return { "item_name": item.name, "original_price": item.price, "final_price": discounted_price } # 运行服务(默认端口 8000) if __name__ == "__main__": import uvicorn uvicorn.run(app, host="0.0.0.0", port=8000) ``` #### 代码解释 - **导入模块**:`FastAPI` 用于创建应用,`BaseModel` 定义请求数据的结构(确保类型安全)。 - **路由装饰器**:`@app.get()` 和 `@app.post()` 定义接口路径和方法。 - **异步支持**:使用 `async def` 支持异步处理,提升性能(FastAPI 的亮点之一)[^4]。 - **数据验证**:`Item` 模型自动验证输入数据,确保 `name` 为字符串、`price` 为浮点数。 - **运行服务**:通过 `uvicorn.run()` 启动服务,可自定义主机和端口(如 `host="0.0.0.0"` 允许外部访问)。 #### 测试接口 1. **启动服务**: ```bash uvicorn main:app --reload ``` - `--reload` 参数支持热重载,便于开发调试。 2. **访问接口**: - GET 接口:在浏览器打开 `http://localhost:8000/`,返回 JSON:`{"message":"欢迎使用 FastAPI 接口服务!"}`。 - POST 接口:使用工具如 curl 或 Postman: ```bash curl -X POST "http://localhost:8000/items/" -H "Content-Type: application/json" -d '{"name":"Book", "price":20.0, "is_offer":true}' ``` 返回结果:`{"item_name":"Book","original_price":20.0,"final_price":18.0}`。 #### 进阶功能 - **文档自动生成**:FastAPI 自动创建交互式文档。访问 `http://localhost:8000/docs` 即可查看和测试所有接口。 - **认证集成**:如引用[^5]所示,可通过 `OAuth2PasswordBearer` 添加安全认证(例如在敏感接口中使用令牌验证)。 - **异步操作**:对于 AI 服务等高性能场景,FastAPI 的异步特性可集成机器学习模型,提升吞吐量[^2]。 以上示例提供了一个可运行的起点,您可以根据需求扩展路径、参数或错误处理。完整项目示例可参考引用中的 FastAPI 文档和教程资源[^3][^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值