使用 Python Quart 向路由处理程序中的请求添加数据

Add data to request in the route handler using Python Quart

我们正在使用 Python Quart 开发 API。 我们有多个路由设置和一个全局错误处理方法

@app.errorhandler(InternalServerError)
def handle_error(error):
    <logging and return server error code>

我们需要一种通过向请求对象添加随机散列来标记每个请求的方法。所以它可以通过点击请求对象在任何地方访问。例如,错误处理程序应该能够访问随每个请求标记的随机散列。

使用 Quart API 框架实现此目的的最简洁方法是什么。我们希望在没有任何意外副作用的情况下实现这一目标。

这是一个基于对 Request 对象进行子类化的完整解决方案,根据 Quart 内部评论,这是首选方法。

https://pgjones.gitlab.io/quart/reference/source/quart.html https://github.com/pgjones/quart/blob/main/src/quart/wrappers/request.py

在此实现中,“correlation_id”需要从 request.args 中获取或即时生成,并且应附加到请求上下文以在整个请求中以代码或错误处理等

(注意:“ABC”导入避免了一些问题,一些 Python 抽象 类 并且不必重新实现抽象方法。)

QuartUtilities.py:

from abc import ABC
from typing import cast
from uuid import uuid4

# Subclass of Request so we can add our own custom properties to the request context
class CorrelatedRequest(Request, ABC):
    correlation_id: str = ""


def correlate_requests(app: Quart):
    app.request_class = CorrelatedRequest

    @app.before_request
    def ensure_correlation_id_present():
        correlated_request = cast(CorrelatedRequest, request)
        if correlated_request.correlation_id != "":
            return

        if 'correlation_id' in request.args:
            correlated_request.correlation_id = request.args["correlation_id"]
        else:
            correlated_request.correlation_id = uuid4()


def get_request_correlation_id() -> str:
    return cast(CorrelatedRequest, request).correlation_id

QuartPI.py:


from quart import Quart
from werkzeug.exceptions import InternalServerError
from QuartUtilities import correlate_requests

app = Quart(__name__)
correlate_requests(app)

@app.errorhandler(InternalServerError)
def handle_error(error):
    correlation_id = get_or_create_correlation_id()