【问题标题】:Python/FastAPI: how can I get headers or a specific header from my backend API?Python/FastAPI:如何从后端 API 获取标头或特定标头?
【发布时间】:2021-07-02 22:47:04
【问题描述】:

我想使用 fastAPI 在函数中从我的 API 中检索特定标头,但我找不到解决方案。

在烧瓶中很简单:request.headers['your-header-name']

为什么用 fastAPI 做这么简单的事情会这么复杂?

有人知道检索标头的解决方案吗?谢谢:)

装饰者:

def token_required(f):
    @wraps(f)
    def decorator(*args, **kwargs):
        CONFIG = settings.read_config()
        token = None
        headers = Request.headers
        if "Authorization" in headers:
            auth_header = Request.headers
            token = auth_header
        elif not token:
            return {"Error": "Token is missing or incorrect header name"}, 401

        try:
            public_key = CONFIG["APPLICATION"]["PUBLIC_KEY"]
            claim = jwt.decode(token, public_key)
            claim.validate()
        except UnicodeDecodeError as err:
            return {"Error": f"An error occurred -> {err} check your token"}, 401

        return f(*args, **kwargs)

    return decorator

我需要阅读“授权”标题以检查是否存在。

【问题讨论】:

    标签: python fastapi


    【解决方案1】:

    很相似,你可以做

    from fastapi import FastAPI, Request
    
    
    @app.get("/")
    async def root(request: Request):
        my_header = request.headers.get('header-name')
        ...
    

    注意:它是小写的

    例子:

    from fastapi import FastAPI, Request
    
    app = FastAPI()
    
    
    @app.get("/")
    async def root(request: Request):
        my_header = request.headers.get('my-header')
        return {"message": my_header}
    

    现在,如果您在本地主机上使用 uvicorn 运行此应用,您可以尝试发送curl

    curl -H "My-Header: test" -X GET http://localhost:8000

    这将导致

    {"message":"test"}

    更新:

    如果你需要在装饰器中访问它,你可以使用以下

    
    def token_required(func):
        @wraps(func)
        async def wrapper(*args, request: Request, **kwargs):
            my_header = request.headers.get('my-header')
            # my_header will be now available in decorator
            return await func(*args, request, **kwargs)
        return wrapper
    
    
    

    【讨论】:

    • 嗨,我需要在装饰器函数中执行此操作。我会更新我的问题以澄清我的问题
    • 为此目的使用中间件不适合您的需求?
    • 无论如何,我会相应地更新我的答案
    • 我正在将一个烧瓶项目转换为一个 fastAPI 项目,但在我的烧瓶项目中,我在我希望它们具有身份验证的路径上使用了装饰器。我不知道如何使用 fastAPI 做同样的事情。
    • 是的,我只需要验证其中的一部分,而不是所有路由。我会看看链接。谢谢ihoryam
    【解决方案2】:

    或者,如 fastapi 文档 (https://fastapi.tiangolo.com/tutorial/header-params/) 中所述:

    from typing import Optional
    
    from fastapi import FastAPI, Header
    
    app = FastAPI()
    
    
    @app.get("/items/")
    async def read_items(user_agent: Optional[str] = Header(None)):
        return {"User-Agent": user_agent}
    

    这将获取user_agent 标头参数。

    【讨论】:

      猜你喜欢
      • 2017-01-22
      • 1970-01-01
      • 1970-01-01
      • 2020-09-28
      • 1970-01-01
      • 2022-12-09
      • 2020-11-16
      • 2016-03-04
      • 2021-04-16
      相关资源
      最近更新 更多