You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何复用同一业务函数实现两个路由并渲染不同模板?

解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 18:54:23