我可以用一个路由处理多个函数吗?

6 投票
1 回答
6553 浏览
提问于 2025-04-17 22:33

我刚开始使用Flask框架,正在尝试解决一个问题。

我有一个用户网页,上面有两个链接:

  • 设置 <a href="{{ url_for('user', user_name=name, user_id=id) }}">设置</a>
  • 详情 <a href="{{ url_for('user', user_name=name, user_id=id) }}">详情</a>

在我的py文件中,我想实现一个功能——一个路由,但根据用户的操作有两种不同的行为:

@app.route("/<user_name>/<int:user_id>")
def user(user_name, user_id):

    # if user click on the "Settings" link then:
    # ...
    # some code
    # ...
    return render_template('user_settings.html', ...)

    # if user click on the "Details" link then:
    # ...
    # some code
    # ...
    return render_template('user_details.html', ...)

或者也许可以这样做——同一个路由,但有两个不同的定义:

# if user click on the "Settings" link then:
@app.route("/<user_name>/<int:user_id>")
def user_settings(user_name, user_id):
    # ...
    # some code
    # ...
    return render_template('user_settings.html', ...)

# if user click on the "Details" link then:
@app.route("/<user_name>/<int:user_id>")
def user_details(user_name, user_id):
    # ...
    # some code
    # ...
    return render_template('user_details.html', ...)

请给我一些建议,因为我不知道该怎么做?提前谢谢你的帮助!:-)

编辑: @dim:问我为什么想要相同的URL?上面的问题只是一个例子,帮助更好地理解我的需求。实际上,我有一个表格输出,里面有行和列。就像在Oracle企业管理器中的输出: oracle em dbconsole的输出

如你所见,这里有两个链接,但它们有相同的Oracle RMAN ID(这很重要,因为查询数据库时有相同的WHERE条件,例如:SELECT ... FROM ... WHERE SESSION_RECID = :parrent_id)。所以:

  • 当我点击“备份名称”列中的链接时,我想渲染一个模板。
  • 当我点击“状态”列中的链接时,我想渲染另一个模板。

总之,我想根据相同的端点渲染两个不同的模板。

1 个回答

5

你可以使用网址的查询字符串参数。简单来说,就是像这样传递一个查询字符串参数 <a href="{{ url_for('user', user_name=name, user_id=id, settings='true') }}">设置</a>,最终会变成 <a href="/sammy/873?settings=true">设置</a>

在视图中,你可以检查 settings 参数是否存在,然后提供相应的模板。

@app.route("/<user_name>/<int:user_id>")
def user_details(user_name, user_id):
    # ...
    # some code
    # ...
    if request.args.get('settings'):
        return render_template('user_settings.html', ...)
    else:
        return render_template('user_details.html', ...)

撰写回答