gpt4 book ai didi

javascript - Flask flash 和 url_for 与 AJAX

转载 作者:太空狗 更新时间:2023-10-30 01:08:12 26 4
gpt4 key购买 nike

我目前被困在一个相当“大”的问题上,我会尽量做到简洁明了。我正在使用 Flask 在 Python 中开发一个工具。它应该是一个内部网。我的想法是我有一个客户页面。有它的名字、许多其他信息和大量 list 。

信息已经写在输入字段中,因此用户只需在那里编辑它们,按回车键,页面就会重新加载编辑后的信息(带有通知,使用闪烁的消息和咆哮声)。

庞大的 list 迫使我转向使用 AJAX 的系统,因为我希望它在用户勾选框并在输入中输入内容时“实时”更新,而无需重新加载页面。

因此,我还将信息的基本输入切换为 AJAX,以避免重新加载页面。

我遇到了两个问题:

  1. 第一个是关于 Flask 的消息闪烁特性。

    我有一种方法可以更新数据库中的客户端名称,闪烁一条消息(成功或失败,取决于许多因素),然后再次显示该页面。为避免页面重新加载,我使用 AJAX 管理表单提交。

    问题是,我的 python 方法会闪烁消息。一旦我回到我的 html 页面(尚未重新加载,因为它是 AJAX),Jinja2 的 get_flashed_message 函数不会返回任何内容,因为它尚未更新。因此,我无法检索那些闪烁的消息。

    我怎样才能得到这些?我看到的唯一解决方案是摆脱任何 flash 的使用,并编写我自己的消息系统,我将从该方法返回,然后在 javascript 中处理。这看起来非常愚蠢,因为 flash 是 Fl​​ask 的一个特性,并且它被 AJAX 变得“无用”。我觉得我错过了什么。

    (请注意,到目前为止,我的闪烁消息管理是在我的基本布局中进行的,它调用一个模板来遍历所有消息并将它们显示为咆哮通知)

  2. 第二个问题涉及 url_for。这是我的表格,用于编辑客户的姓名:

<form id="changeClientName" method="POST" action="{{ url_for('clients.edit_client_name', name=client.name) }}" style="display:inline !important;">
<input type="text" name="name" class="form-control" value="{{ client.name }}" >
<input type="submit" style="position: absolute; left: -9999px; width: 1px; height: 1px;"/>
</form>

如您所见,action 属性使用url_for 调用正确的方法来编辑客户端。我的方法如下所示:

@mod.route('/edit/<name>/', methods=['POST'])
def edit_client_name(name):
# code here

例如,客户端名称编辑前后的端点为 /edit/the_client_name/edit/the_new_client_name。显然,调用该方法后,我的 AJAX 必须更改此操作属性以将其替换为新的 URL(以防用户想要在不更改页面/重新加载页面的情况下重新编辑名称)。这是我的第二期。

新名称存储在 javascript 中,而操作仍然是旧端点。因此,我必须使用新名称调用 url_for。而且我找不到将 Javascript 变量传递给 Jinja2 的方法。

我想要这个:

url_for('clients.edit_client_name', name=client.name)

变成这样:

url_for('clients.edit_client_name', name=my_javascript_variable_one_way_or_another)

我只需调用修改表单属性的 javascript 函数,并使用这个新的 url_for 修改我的 action 属性。但我没有找到这样做的方法,即将一个 javascript 变量传递给 Jinja2。


所以这是我的两个问题。如何使 flash() 与 AJAX 兼容?另外,如何将 javascript 属性传递给 Jinja2?

我能看到的唯一解决方案是编写我自己的消息系统,这会破坏 flash 的目标,使其无法与 AJAX 一起使用,这看起来很愚蠢,并且在我的模板中对 URL 进行硬编码,这完全破坏了最初的兴趣Flask 使 URL 独立于方法,并且 URL 变化极其灵活。

谢谢。

最佳答案

我会尝试一下,但我不确定我是否完全理解了这个问题 :D。下面的代码没有经过测试,它更像是伪代码!

您的第一个问题是(如果我理解正确的话)您正在通过 ajax 进行部分更新,并且希望在部分更新之后稍后获取更新结果。您应该在每次 ajax 调用之后返回它们,而不是稍后获取更新结果。因此,如果您有如下所示的更新代码:

data = $('#my-form').serialize()
$.post(update_url, data, function (results) {
// Here you check results.
if (results.success) {
$('#update-div').message('Update Success')
} else {
$('#update-div').message('Update Failed: ' + results.error_msg)
}
})

然后你的更新路线会有类似这样的代码:

from flask import jsonify

@app.route('/partialupdate/<int:userid>', methods=['POST'])
def partial_update(userid):
try:
# fetch the user, perform the updates and commit
return jsonify(success=1)
except Exception, e:
return jsonify(success=0, error_msg=str(e))

可以通过使用 USERID 而不是客户端名称来解决涉及 URL 生成的第二个问题。 绝不 将客户端名称用于搜索以外的任何内容 :D。在这种情况下使用用户 ID。用户 ID 通常是数据库中特定用户的主键。如果您不使用数据库,则以某种方式生成您自己的用户 ID 并将其附加到用户 - 它应该是每个用户的唯一编号。使用用户 ID 意味着您始终可以使用像“/edituser/1”这样的 url 进行编辑。

关于javascript - Flask flash 和 url_for 与 AJAX,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24288380/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com