Flask泛型路由冲突问题:/factory/doc路由无法触发
解决Flask路由匹配冲突问题
方案一:自定义路由转换器排除特定前缀
通过自定义Werkzeug路径转换器,让通用路由自动跳过以doc/开头的路径,确保文档上传路由能被正常匹配。
- 定义自定义转换器:
from werkzeug.routing import PathConverter class NoDocPathConverter(PathConverter): # 正则规则:匹配不以doc/开头的任意路径 regex = r'(?!doc\/).+' # 将转换器注册到Flask应用 app.url_map.converters['no_doc_path'] = NoDocPathConverter
- 修改通用请求路由的路径参数:
@app.route('/factory/<no_doc_path:url>', methods=['GET', 'POST', 'PUT', 'DELETE']) @cross_origin() def request_factory(url: str): resp = manage_factory_message(request) return app.response_class( response=resp.content, mimetype=resp.headers['Content-Type'], status=resp.status_code )
修改后,通用路由只会响应/factory/后不以doc/开头的请求,/factory/doc/开头的POST请求会自动匹配到文档上传路由。
方案二:在通用路由内判断转发
如果无法调整路由顺序,可直接在通用路由的视图函数里做分支判断,手动转发符合条件的请求到上传逻辑:
@app.route('/factory/<path:url>', methods=['GET', 'POST', 'PUT', 'DELETE']) @cross_origin() def request_factory(url: str): # 检查是否是POST请求且路径以doc/开头 if request.method == 'POST' and url.startswith('doc/'): # 去掉url开头的doc/,匹配原上传路由的参数格式 return upload_file_factory(url.lstrip('doc/')) resp = manage_factory_message(request) return app.response_class( response=resp.content, mimetype=resp.headers['Content-Type'], status=resp.status_code )
这种方式无需修改路由规则,直接在现有通用路由内完成分流,确保上传请求走对应处理逻辑。
内容的提问来源于stack exchange,提问作者Nicolas Ferreira
相关产品推荐
相关产品推荐

