我目前陷入了一个相当“大”的问题,我会尽量做到清晰和简洁。
我正在用Python开发一个工具,使用Flask。它应该是一个内部网。我的想法是我有一个客户页面。有它的名字,许多其他信息,和一个庞大的清单。
信息已经写入输入字段,因此用户只需在那里编辑它们,按enter键,页面就会重新加载已编辑的信息(使用闪烁的消息和咆哮发出通知)。
这个庞大的清单迫使我使用AJAX迁移到一个系统,因为我希望它在用户勾选框和输入内容时“实时”更新,而不必重新加载页面。
因此,我还将infos的基本输入转换为AJAX,以避免重新加载mage。
我遇到了两个问题:
第一个是Flask的消息闪烁功能。我有一个方法可以更新数据库中的客户机名称,闪烁一条消息(成功或失败,取决于许多事情),然后再次显示页面。为了避免页面重新加载,我使用AJAX管理表单提交。
问题是,我的python方法将刷新消息。一旦我回到我的html页面(因为它是AJAX,所以没有被重新加载),Jinja2的get flashed消息函数就不会返回任何东西,因为它没有被更新。因此,我不可能找回那些闪现的信息。
我怎样才能拿到这些?我看到的唯一解决方案是去掉flash的任何用法,编写我自己的消息sysème,我将从该方法返回,然后用javascript处理。这看起来难以置信的愚蠢,因为flash是Flask的一个特性,它被AJAX变成了“无用的”?我觉得我好像错过了什么。
(注意,到目前为止,我的flashed消息管理是在我的基本布局中进行的,它调用一个贯穿所有消息并显示为咆哮通知的模板)
第二个问题涉及url。这是我的表单,用于编辑客户名称:
如您所见,action属性使用url_for调用正确的方法来编辑客户机。我的方法是这样的:@mod.route('/edit//', methods=['POST'])
def edit_client_name(name):
所以url路径是/edit/the_client_name。因此,在编辑之后,如果要重新编辑此名称,则新URL是/edit/the_new_client_name。
显然,一旦调用了方法,我的AJAX就必须更改这个action属性,用新的URL替换它(以防用户希望在不更改页面/重新加载页面的情况下重新编辑名称)。这是我的第二期。
新名称存储在javascript中。操作仍然是旧的url。因此,我必须调用url_来使用新名称。我发现完全没有办法将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)
我只需要调用js函数来修改表单的一个属性,然后用这个新的url修改我的action属性,但是我没有办法做这个简单的事情,比如给Jinja2一个javascript变量,这在我看来是不太可能的。
这是我的两个问题。如何使flash与AJAX兼容?如何将javascript属性传递给Jinja2?
我真心希望能找到解决这两个“愚蠢”问题的办法。我能看到的唯一解决方案是编写我自己的消息传递系统,这将挫败flash的目标,使它与看起来愚蠢的AJAX无用,并在我的模板中硬编码URL,这完全挫败了Flask使URL独立于方法的最初兴趣,URL的更改非常灵活。
谢谢。