Python FastAPI 具有相同路由的多个方法不起作用

问题描述 投票:0回答:1

当我在路由器上使用相同的路由执行多种方法时,我遇到了 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/").

python python-requests fastapi
1个回答
0
投票

代码的行为符合预期,所以我猜测您所包含的代码之外还有一些问题。独立的示例:

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'}
© www.soinside.com 2019 - 2024. All rights reserved.