【问题标题】:Doing an AJAX POST followed by GET with Flask使用 Flask 执行 AJAX POST,然后执行 GET
【发布时间】:2013-12-10 20:12:03
【问题描述】:

我的目标是让用户填写一个表单,在 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)

我的POST 功能成功后,我是否必须单独提出GET 请求?如果是这样,我该怎么做?

这是 AJAX 请求(如果重要,可以在应用的每个页面上调用此代码):

$.ajax({
              url:"/filteredsearch/",
              type: 'POST',
              data: json,
              contentType: 'application/json;charset=UTF-8',
              success: function() {
                           alert("Done");
                       }
          });

因此,理想情况下,我可以在发布时渲染模板。如果不是这种情况,我该如何从同一个 ajax 函数发出 GET 请求?

我知道您通常使用url_for() 来发送GET 请求,考虑到我目前在JS 中,这是一个选项吗?

【问题讨论】:

    标签: jquery python ajax flask


    【解决方案1】:

    通常您使用 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。

    【讨论】:

    • 这是我错过的烧瓶吗?我需要用一个变量(上面称为filter_results)填充新模板。您描述的方法有这种可能性吗?
    • 并非如此。这是一个Web开发的事情。如果您只想发出一个发布请求,然后使用呈现的模板进行响应,请不要将其作为 AJAX 请求。只需使用带有提交按钮的 html 表单。 w3schools.com/html/html_forms.asp
    • 不,您只需制作一个 html 表单并让用户单击提交按钮。 <form action="/filteredsearch/" method="POST"><input type="text" name="search><input type="submit"></form> 单击该提交按钮将向 /filteredsearch 发出一个发布请求,然后您可以处理服务器端并使用您呈现的模板进行响应。
    • POST 请求与 GET 没有太大区别。它只是在标头中编码了一些数据。问题是您正在发送响应,但当您在浏览器中收到它时没有对其进行任何处理。当您提交表单时,浏览器将自动处理响应。一切都会好起来的。
    • 不是。服务器端(Flask)代码不会改变。目前,您正在发出 AJAX POST 请求,然后对响应不做任何事情。该响应将包括呈现的模板。看看您的 AJAX 请求如何使用 success 参数?响应调用该函数。从您告诉我的内容来看,您没有理由将此 POST 请求作为 AJAX 调用。只需以正常方式(即单击表单中的提交按钮)即可。
    【解决方案2】:

    我知道这有点晚了,但我只是遇到了和你一样的问题。

    我需要使用 Ajax 进行 POST,然后如果成功,我需要向烧瓶发出 GET 请求以返回呈现的模板。比如:

    烧瓶部分:

    @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 部分:

    $.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
            }
    });
    

    请注意,我离成为一名 Ajax 专家还很遥远。我不知道这是否是正确的方法,但这是我找到的最简单的方法。

    【讨论】:

    • 完美运行。泰
    • 我们如何随请求一起传输数据?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-07
    • 1970-01-01
    • 2014-11-26
    相关资源
    最近更新 更多