烧瓶闪存和网址
我目前陷入了一个相当“大”的问题,我会努力尽可能清楚和简洁。 我正在使用Flask开发一个Python工具。 它意味着是一个内联网。 这个想法是我有一个客户端页面。 有它的名字,许多其他信息和一个巨大的清单。
这些信息已经写入输入字段,因此用户只需在那里编辑它们,按回车键,页面就会重新载入编辑后的信息(使用闪烁的消息和咆哮)。 这个庞大的检查清单迫使我转向使用AJAX的系统,因为我希望用户能够在输入时勾选框并输入内容而不需要重新加载页面,从而“更新”现场。
因此,我也将我的基本信息输入切换到AJAX,以避免重新加载法师。
我遇到了两个问题:
第一个涉及Flask的消息闪烁功能。 我有一种方法可以更新数据库中的客户端名称,闪烁显示一条消息(成功或失败,取决于许多事情),然后再次显示该页面。 为了避免页面重新加载,我使用AJAX管理表单提交。
问题是,我的python方法会刷新消息。 一旦我回到我的html页面(由于它是AJAX,它没有被重新加载),Jinja2的get_flashed_message函数没有返回任何内容,因为它没有被更新。 因此,我不可能找回那些闪过的信息。
我怎样才能得到这些? 我看到的唯一解决方案是摆脱闪存的使用,编写我自己的消息系统,我会从方法返回,然后在javascript中处理。 这看起来非常愚蠢,因为Flash是Flask的一个功能,并且它被AJAX“无用”了吗? 我觉得我失去了一些东西。 (作为一个说明,直到现在,我的闪存消息管理是在我的基本布局中进行的,该模板调用了一个模板,该模板运行所有消息并将它们显示为咆哮通知)
第二个问题涉及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):
所以url路径是/ edit / the_client_name。 因此,在编辑之后,如果我们要重新编辑此名称,则新URL为/ edit / the_new_client_name。 显然,一旦方法被调用,我的AJAX必须改变这个action属性,用新的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)
我只需要调用修改表单属性的js函数,然后使用这个新的url_for修改我的action属性。但是我发现没有办法让这个简单的东西,即给Jinja2一个javascript变量,这似乎对我来说不太可能。
所以这是我的两个问题。 我怎样才能使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))
涉及URL生成的第二个问题可以通过使用USERID而不是客户端名称来解决。 除了搜索以外,不要使用客户名称:D。 在这种情况下使用用户ID。 用户标识通常是数据库中特定用户的主键。 如果你不使用数据库,那么以某种方式生成你自己的用户标识并将其附加到用户 - 它应该是每个用户的唯一编号。 使用用户ID意味着您可以随时使用像'/ edituser / 1'这样的网址进行编辑。
我也有这个要求。 为了充实Paul Wand的答案,下面是我如何做到的(请注意,生成的标记用于引导程序3):
在模板中为flash消息放置一个空的div:
<div id="flash"></div>
你的ajax调用:
$.post("/foo/bar", JSON.stringify({'calls': 'whatever'}), function(returnedData) {
$('#flash').append(flashMessage(JSON.parse(returnedData)));
});
并使用解析功能:
var flashMessage = function(data){
html = '';
for (i=0; i<data.length; i++) {
html += '<div class="alert alert-' + data[i]['type'] + '"><a href="#" class="close" data-dismiss="alert">×</a>' + data[i].message + '</div>';
}
return html;
};
在处理AJAX请求的路由中,只需返回一个如下所示的JSON对象:
[{'type': 'success', 'message': 'Here is a message'}]
'type'是引导3状态类型,即。 成功,信息,警告,危险。 字典被包装在一个列表中,所以如果需要的话可以传递多个字符。
通过了解flash_message.html格式化的方式,您可以编写一个简单的JavaScript方法来替换烧瓶“flash”方法的功能。
function flash(message,category){
if (category == 'error'){
var icon='icon-exclamation-sign';
category='danger';
}
else if (category == 'success')
var icon='icon-ok-sign';
else
var icon='icon-info-sign';
$('<div class="alert alert-'+category+'"><i class="'+icon+'"></i> <a class="close" data-dismiss="alert">×</a>'+ message +'</div>').prependTo('#maincontent').hide().slideDown();
$.smoothScroll({
scrollElement: $('body'),
scrollTarget: '#mainContent'
});
}
url_for可能有点棘手,但可能。
链接地址: http://www.djcxy.com/p/71915.html上一篇: Flask flash and url