我的目标是让用户填写表单,在POST请求中将该信息发送到烧瓶服务器,然后使用该表单信息呈现模板(在服务器上经历一些逻辑之后)。
到目前为止,我已经完成了所有这些的POST部分。我正在尝试在if request.method == POST'
内部渲染一个模板,我想这现在无法正常工作。
这是我到目前为止的代码:
@app.route('/filteredsearch/', methods = ["GET", "POST"])
def filteredsearch():
if request.method == 'POST':
data = json.loads(request.data)
tables = data['checkboxes']
filter_results = getFilteredEntities(tables = tables)
print filter_results #This works
return render_template("filteredsearch.html", entities = filter_results)
我是否必须单独GET
我的POST
功能成功请求?如果是这样,我该怎么做?
这是AJAX请求(如果重要的话,可以在应用程序的每个页面上调用此代码):
$.ajax({
url:"/filteredsearch/",
type: 'POST',
data: json,
contentType: 'application/json;charset=UTF-8',
success: function() {
alert("Done");
}
});
所以,理想情况下,我可以在发布时渲染模板。如果不是这样,我该如何从同一个ajax函数执行GET
请求?
我知道通常你使用url_for()
作为GET
请求,这是一个选项,因为我现在在JS吗?
答案 0 :(得分:4)
通常,您使用ajax请求返回您随后在页面中动态显示的数据。
$.ajax({
url:"/filteredsearch/",
type: 'POST',
data: json,
contentType: 'application/json;charset=UTF-8',
success: function(evt) {
$("#results").html = evt.data;
}
});
如果您要重定向到另一个模板,那么为什么不在发出POST的表单上单击“提交”,然后使用新模板进行响应。如果实际想要在ajax请求返回后重定向到整个新页面(这比仅显示您已经收到的信息要慢),那么您可以更改窗口。地点。像window.location = 'http://www.example.com'
这样的东西会将用户带到example.com。
答案 1 :(得分:2)
我知道这有点晚了,但我遇到的问题与你相同。
我需要使用Ajax进行POST,然后如果成功,我需要向flask发出GET请求以返回呈现的模板。类似的东西:
FLASK PART:
@app.route('/something', methods=['POST'])
def something_post():
# Get JSON object passed with Ajax request
elems = request.json
# Do stuff
# If everithing is OK, return success message
return json.dumps({'success': True}), 200, {'ContentType': 'application/json'}
@app.route('/something', methods=['GET'])
def something_get():
# Return template
return render_template('something.html')
AJAX PART:
$.ajax({
type: 'POST',
data: myJsonString, // JASON object passed to flask
url: '/something',
contentType: "application/json",
method: 'POST',
success: function(response) {
# If we succed we make a request to get the template
window.location.href = "/something";
# With this line we are making a simple GET request to Flask and the template returned is opened in the current window
}
});
请注意,我远远不能成为阿贾克斯专家。我不知道这是否是正确的方法,但这是我找到的最简单的方法。