【问题标题】:FastAPI default response for specific statusFastAPI 对特定状态的默认响应
【发布时间】:2022-12-18 12:30:12
【问题描述】:

在这里我们可以声明调用端点时应该向客户端发送什么状态码:

@router.post("/", status_code=status.HTTP_201_CREATED)

我在响应主体中遇到的问题我必须返回一些东西,无论是 JSONResponse 还是 PlainTextResponse 我想知道是否可以不返回路由器主体中的任何内容,而是为任何状态代码定义默认行为和响应,例如这例如:

@router.post("/", status_code=status.HTTP_201_CREATED)
async def create_post(req: post_schemas.Post):
    # create the post record
    # I wanna get rid of this part and do this automatically in a way
    return PlainTextResponse(status_code=status.HTTP_201_CREATED, content="Created")

并且客户端收到“已创建”消息而不是空消息

编辑这是我想出的

responses = {200: "OK", 201: "Created"}

@app.middleware("http")
async def no_response_middleware(request: Request, call_next):
    response = await call_next(request)
    if (
        response.status_code in responses
        and int(response.headers["content-length"]) == 4
    ):
        return PlainTextResponse(
            status_code=response.status_code, content=responses.get(response.status_code)
        )
    return response

【问题讨论】:

    标签: python fastapi


    【解决方案1】:

    这是可行的 middleware

    它可以在返回给客户端之前访问响应。这意味着您可以在那里编写自定义逻辑并在需要时替换它

    @app.middleware("http")
    async def no_response_middleware(request: Request, call_next):
        response = await call_next(request)
        if is_null_response(response) and response.status_code == 201: # Maybe just a check for 201
            return MyDefaultResponse
        return response
    

    【讨论】:

    • 实际上我昨晚想到了使用中间件并且它有效,但是为了检查响应是否为空,我不知道以更干净的方式进行。我在哪里可以找到is_null_response?我查了但没找到
    • @HosseinGholami 实际上这是我想出的名字,你不能在任何地方导入它。所以这是一个人应该自己写的东西。我的猜测是检查正文、标题,也许只是字节。必须确保您不会使用正确的返回主体捕获 201 响应。
    • 好的,我正在检查响应的长度。我要添加我在问题中编码的内容
    猜你喜欢
    • 2018-12-15
    • 2011-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    • 1970-01-01
    相关资源
    最近更新 更多