【问题标题】:How can I set attribute to request object in FastAPI from middleware?如何从中间件设置属性以请求 FastAPI 中的对象?
【发布时间】:2020-10-30 04:32:44
【问题描述】:

如何从中间件函数中为Request 对象设置任意属性?

from fastapi import FastAPI, Request

app = FastAPI()


@app.middleware("http")
async def set_custom_attr(request: Request, call_next):
    request.custom_attr = "This is my custom attribute"
    response = await call_next(request)
    return response


@app.get("/")
async def root(request: Request):
    return {"custom_attr": request.custom_attr}

此设置引发异常,

AttributeError: 'Request' 对象没有属性 'custom_attr'

那么,如何在我的路由器中获取 "This is my custom attribute" 值?

【问题讨论】:

    标签: python middleware fastapi


    【解决方案1】:

    我们无法将属性附加/设置到 request 对象(如果我错了,请纠正我)。

    但是,我们可以使用Request.state--(Doc) 属性

    from fastapi import FastAPI, Request
    
    app = FastAPI()
    
    
    @app.middleware("http")
    async def set_custom_attr(request: Request, call_next):
    
        request.state.custom_attr = "This is my custom attribute" # setting the value to `request.state`
    
        response = await call_next(request)
        return response
    
    
    @app.get("/")
    async def root(request: Request):
        return {"custom_attr": request.state.custom_attr} # accessing the value from `request.state`

    【讨论】:

    • 好吧,您将它附加到请求对象。 :P
    • 更准确地说,这是starlette的一个特性:starlette.io/requests/#other-state
    • 感谢您的回答。经过数小时的头部撞击后,它工作得很好。或许值得引用 FastAPI 文档:“request.state 是每个 Request 对象的属性。它用于存储附加到请求本身的任意对象,例如本例中的数据库会话。”
    猜你喜欢
    • 2021-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多