在我的 Flask 应用程序中,我有一个销售页面,它收集信息并通过 ajax post 请求将其保存到数据库中。可供用户记录销售额的控制台数量有限。一个用户可以从另一个用户那里接管控制台,但在这种情况下,我希望初始用户无法访问控制台。在销售页面的 View 中检索到的控制台数据具有确定这一点所需的信息(每次新销售后可用)。
我知道我无法在 View 中使用标准的“return redirect(url_for(‘dup_console’))”来执行此操作,因为我是通过 ajax 调用发帖。
我花了很多时间搜索 SO 并找到了建议在 ajax 调用的成功部分执行条件逻辑的解决方案
示例:
success: function(data) {
if (data.redirect) {
window.location.href = data.redirect;
}
}
我不确定这是否适用于我的情况,因为我不知道如何将控制台数据从 View 获取到成功例程。当我检查来自成功例程的响应信息时,它包含来自页面的 html。
有没有办法从 View 中获取我需要的信息到ajax post的成功例程?
这是我的一部分代码(我试图将其缩减为相关部分):
查看 - 销售控制台
@main.route('/sales_console/<int:id>', methods=['GET', 'POST'])
@login_required
def sales_console(id):
product_data = get_product_data()
console_data = get_console_data(id)
if request.method == 'POST':
returned_data = json.dumps(request.get_json())
returned_data_dict = ast.literal_eval(returned_data)
<review returned data and store in database>
<retrieved data indicates if console id used by other device>
if duplicate_console:
redirect to page indicating console loss (I know I can’t do it like this)
return render_template('sales_console.html', product_data=product_data, console_data=console_data)
可用于 sales_console.html 模板的 Java 脚本例程
function record_sale(event,track_sales_data,console_number)
{
var sales_data_json = JSON.stringify(track_sales_data);
var url = "/sales_console/"+console_number;
$.ajax({
url: url,
type : "POST",
data: sales_data_json,
contentType:"application/json",
success: function(response) {
console.log("success!!!");
console.log(response);
},
error: function(error) {
console.log("failure!!!");
console.log(error);
}
});
};
最佳答案
在 python 中,返回任何你想在成功时重定向的路径作为你返回的 json 对象的一部分,像这样:
from flask import jsonify
# ...
if request.method == 'POST':
# ...
return jsonify(dict(redirect='path'))
在 javascript 中,将返回的路径分配给 location.href
属性,以触发重定向。像这样:
// ...
success: function(response) {
if (response.redirect) {
window.location.href = response.redirect;
}
}
关于javascript - 在 flask 应用程序中,如何根据 View 中发现的条件在 ajax 发布期间重定向到新页面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44682326/