如何为 Flask 路由参数指定枚举类型提示

How do I specify an enum type hint for a flask route parameter

我有以下枚举

class RequestType(str, Enum):
     type1 = "abc"
     type2 = "xyz"

以及以下烧瓶路线:

@app.route("/api/v1/<type>", methods=["POST"]
def type(type):
     # do stuff

我希望能够做这样的事情:

@app.route("api/v1/<RequestType:type>", methods=["POST"]

但是我找不到一种方法来实现这样的功能。有没有好的方法来做到这一点?或者通过其他方式将 type 的值限制为有限的字符串列表?

您需要添加一个custom converter。这会将 URL 的提取部分转换为您定义的枚举常量,或将传递的常量转换为 URL 的一部分。为了能够使用它,必须将它添加到带有标识符的转换器的映射中。从现在开始,它可以在每个规则中与注册名称一起使用,或者可以使用已定义枚举类型的传递参数通过 url_for 创建 URL。

from flask import Flask
from enum import Enum, unique
from werkzeug.routing import BaseConverter, ValidationError

@unique
class RequestType(str, Enum):
    TYPE1 = 'abc'
    TYPE2 = 'def'

class RequestTypeConverter(BaseConverter):

    def to_python(self, value):
        try:
            request_type = RequestType(value)
            return request_type
        except ValueError as err:
            raise ValidationError()

    def to_url(self, obj):
        return obj.value


app = Flask(__name__)
app.url_map.converters.update(request_type=RequestTypeConverter)

@app.route('/api/v1/<request_type:t>', methods=['POST'])
def root(t):
    return f'{t.name} -> {t.value}'