我可以用一个路由处理多个函数吗?
我刚开始使用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 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', ...)