如何从后端 API 获取标头或特定标头?

Mel*_*lom 30 python fastapi

我想使用 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
Run Code Online (Sandbox Code Playgroud)

我需要读取“授权”标头来检查是否存在。

iho*_*yam 47

非常相似,你可以这样做

from fastapi import FastAPI, Request


@app.get("/")
async def root(request: Request):
    my_header = request.headers.get('header-name')
    ...
Run Code Online (Sandbox Code Playgroud)

注意:它是小写的

例子:

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}
Run Code Online (Sandbox Code Playgroud)

现在,如果您在本地主机上使用 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


Run Code Online (Sandbox Code Playgroud)


小智 13

或者,如 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}
Run Code Online (Sandbox Code Playgroud)

这将获取user_agent标头参数。