如何为 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}'
我有以下枚举
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}'