Flask路由如何匹配指定URL列表,非法路径返回404?
Flask路由精准匹配指定路径的优雅实现
给你两个不用在函数内做判断的优雅实现方式:
1. 使用内置any转换器(最简洁直接)
直接修改路由规则,用Flask内置的any转换器枚举允许的路径参数值,非枚举值的请求会自动返回404:
@app.route('/list/<any(user, course, teacher):object>') def list_object(object): # 从数据库查询对应对象列表 return object
这个写法会严格匹配user、course、teacher这几个参数,请求/list/fxxk这类非法路径时,Flask会直接返回404响应,完全不需要在函数里加额外判断逻辑。
2. 自定义URL转换器(适合动态扩展场景)
如果后续需要频繁新增允许的对象类型,不想每次都修改路由里的枚举值,可以自定义一个URL转换器:
from werkzeug.routing import BaseConverter # 自定义转换器类 class AllowedObjectConverter(BaseConverter): def __init__(self, url_map, *allowed_items): super().__init__(url_map) # 生成匹配允许值的正则表达式 self.regex = '|'.join(allowed_items) # 把转换器注册到Flask应用 app.url_map.converters['allowed_obj'] = AllowedObjectConverter # 使用自定义转换器 @app.route('/list/<allowed_obj(user, course, teacher):object>') def list_object(object): # 从数据库查询对应对象列表 return object
后续要新增允许的对象,比如student,只需要修改路由里的参数:<allowed_obj(user, course, teacher, student):object>即可,维护起来更灵活。
内容的提问来源于stack exchange,提问作者NickNiu
相关产品推荐
相关产品推荐

