如何复用同一业务函数实现两个路由并渲染不同模板?
解决Flask路由冗余代码的几种方法
方法1:提取公共逻辑到独立函数
把重复的业务逻辑抽成单独的函数,两个路由函数仅负责调用该函数并返回对应模板,直观且易维护。
def get_approval_data(prelim_uid): # 这里放置所有相同的业务逻辑 # 比如查询数据库、处理请求参数、生成业务数据等 data = { 'prelim_uid': prelim_uid, # 其他处理完成的业务数据 } return data @app.route('/analysis_equipment_overview_approvalviewv2/<prelim_uid>', methods=['GET', 'POST']) def analysis_equipment_overview_approvalviewv2(prelim_uid): data = get_approval_data(prelim_uid) return render_template('template_1.html', **data) @app.route('/analysis_equipment_overview_approvalview/<prelim_uid>', methods=['GET', 'POST']) def analysis_equipment_overview_approvalview(prelim_uid): data = get_approval_data(prelim_uid) return render_template('template_2.html', **data)
方法2:单个视图函数绑定多个路由,通过参数区分模板
用多个@app.route装饰器绑定同一个视图函数,通过路由参数或请求路径判断要渲染的模板,减少重复函数定义。
方式A:利用路由的defaults参数
@app.route('/analysis_equipment_overview_approvalview/<prelim_uid>', methods=['GET', 'POST'], defaults={'template_name': 'template_2.html'}) @app.route('/analysis_equipment_overview_approvalviewv2/<prelim_uid>', methods=['GET', 'POST'], defaults={'template_name': 'template_1.html'}) def analysis_equipment_overview_approvalview(prelim_uid, template_name): # 这里放置所有相同的业务逻辑 data = { 'prelim_uid': prelim_uid, # 其他处理完成的业务数据 } return render_template(template_name, **data)
方式B:根据请求路径判断模板
如果不想依赖defaults参数,可直接在函数内通过请求路径判断模板:
from flask import request @app.route('/analysis_equipment_overview_approvalview/<prelim_uid>', methods=['GET', 'POST']) @app.route('/analysis_equipment_overview_approvalviewv2/<prelim_uid>', methods=['GET', 'POST']) def analysis_equipment_overview_approvalview(prelim_uid): # 相同的业务逻辑 data = { 'prelim_uid': prelim_uid, # 其他处理完成的业务数据 } # 根据当前请求路径选择对应模板 if 'v2' in request.path: return render_template('template_1.html', **data) else: return render_template('template_2.html', **data)
方法3:用add_url_rule批量注册路由
如果后续可能新增更多类似路由,用add_url_rule可以更灵活地批量注册,避免重复编写装饰器:
def approval_view(prelim_uid, template_name): # 相同的业务逻辑 data = { 'prelim_uid': prelim_uid, # 其他处理完成的业务数据 } return render_template(template_name, **data) # 注册第一个路由 app.add_url_rule( '/analysis_equipment_overview_approvalviewv2/<prelim_uid>', view_func=approval_view, methods=['GET', 'POST'], defaults={'template_name': 'template_1.html'} ) # 注册第二个路由 app.add_url_rule( '/analysis_equipment_overview_approvalview/<prelim_uid>', view_func=approval_view, methods=['GET', 'POST'], defaults={'template_name': 'template_2.html'} )
内容的提问来源于stack exchange,提问作者Afiq Khairuddin
相关产品推荐
相关产品推荐

