当我在路由器上使用相同的路由执行多种方法时,我遇到了 FastAPI 的问题。
当我使用装饰器
@router.get("/route/")
和 @router.post("/route/")
定义不同的函数时,当我执行 requests.post()
时,它会询问我参数,例如我是否在端点上执行 GET 请求并仅考虑 GET 端点。
是否有可能有一个同时处理 GET 和 POST 方法的路由?
这是 FastAPI main.py 文件的示例:
from fastapi import FastAPI
from app.routers import test
app = FastAPI()
app.include_router(test.router)
if __name__ == "__main__":
uvicorn.run("main:app", host="0.0.0.0", port=5500)
这是路由器:
from fastapi import APIRouter, Depends, UploadFile, File, HTTPException, Response, status
router = APIRouter(
prefix="/test",
tags=["test"],
responses={404: {"description": "Not found"}},
)
@router.get("/route/{arg_test}/")
def get_function(arg_test:str, agr_2_test:int):
# do something
pass
@router.post("/route/{arg_test}/")
def post_function(arg_test:str, json_data:dict):
# do something
pass
使用此脚本,当我执行以下脚本时,它将请求 GET 端点而不是 post:
import requests
data = {"test_attribute":"test"}
requests.post(url_fastapi, json=data)
我想我可以用
Request
类做一些事情,以便将两个请求方法连接到同一个 @router.route()
装饰器中,并根据方法拆分函数内部的进程,但我想保留使用的逻辑装饰器 @router.get("/route/")
和 @router.post("/route/").
代码的行为符合预期,所以我猜测您所包含的代码之外还有一些问题。独立的示例:
from fastapi import FastAPI
from fastapi import APIRouter, Depends, UploadFile, File, HTTPException, Response, status
import uvicorn
router = APIRouter(
prefix="/test",
tags=["test"],
responses={404: {"description": "Not found"}},
)
@router.get("/route/{arg_test}/")
def get_function(arg_test:str, agr_2_test:int):
return {"op": "GET"}
@router.post("/route/{arg_test}/")
def post_function(arg_test:str, json_data:dict):
return {"op": "POST"}
app = FastAPI()
app.include_router(router)
if __name__ == "__main__":
uvicorn.run(app, port=5500)
提出请求时:
>>> requests.get("http://localhost:5500/test/route/foo/?agr_2_test=2").json()
{'op': 'GET'}
>>> requests.post("http://localhost:5500/test/route/foo/", json={"foo": "bar"}).json()
{'op': 'POST'}