从烧瓶返回错误消息到模态相同的形式

时间:2018-09-13 16:33:30

标签: python ajax flask modal-dialog

HTML:我在模式(index.html)中有一个“注册”表单

JS:将表单数据发布到python烧瓶函数:/ signup_user

  $(function () {
$('#signupButton').click(function () {
  $.ajax({
    url: '/signup_user',
    method: 'POST',
    data: $('#signupForm').serialize()
  })
    .done(function (data) {
      console.log('success callback 1', data)
    })
    .fail(function (xhr) {
      console.log('error callback 1', xhr);
    })
  })
}); 

Python /烧瓶:

@app.route('/signup_user', methods=['POST'])
def signup_user():
#Request data from form and send to database
#Check that username isn't already taken
#if the username is not already taken  
    if new_user:
        users.insert_one(new_user)
        message = "Success"
        return message
#else if ussername is taken, send message to user viewable in the modal
    else:
        message = "Failure"
        return message
return redirect(url_for('index'))

我无法弄清楚如何获得flask函数,以将“ Failure”消息返回到模态表单中,以便用户可以更改用户名。

现在,当我单击“提交”按钮时,表单/模式就会消失,并且“失败”消息将整个页面刷新为空白页面,并带有失败字样。 如何将错误消息重新显示为表单/模式?

4 个答案:

答案 0 :(得分:0)

我认为问题在于,最后 signup_user 脚本中具有重定向功能。这就是页面刷新并显示脚本返回的消息的原因。

因此删除此行:

return redirect(url_for('index'))

并将您的Ajax代码更新为此:

$(function () {
 $('#signupButton').click(function () {
  $.ajax({
    type: "post",
    url: "postride.php",
    data:dataString,
    success: function (data) {
        $('#signupMessages').html(data);
    }
 });
});

Python /烧瓶:

@app.route('/signup_user', methods=['POST'])
def signup_user():
#Request data from form and send to database
#Check that username isn't already taken
#if the username is not already taken  
if new_user:
    users.insert_one(new_user)
    message = "Success"
    return message
#else if ussername is taken, send message to user viewable in the modal
else:
    message = "Failure"
    return message

让我知道这是否可行。

答案 1 :(得分:0)

根据https://codehandbook.org/python-flask-jquery-ajax-post/

,这似乎是AJAX的正确语法
        $.ajax({
            url: '/signup_user',
            data: $('#signupForm').serialize(),
            type: 'POST',
            success: function(response) {
                console.log(response);
            },
            error: function(error) {
                console.log(error);
            }
        });

您也可以尝试使用getJSON作为速记:

        $.getJSON('/signup_user',
            $('#signupForm').serialize(),
            function(res) {
            console.log(res)
        });

已更新: 在我自己的使用中,我发现在flask的@ app.route中进行ajax调用不需要methods=['POST']。我可能是错的。

答案 2 :(得分:0)

我要做的是首先检查我们是否到达函数,函数上有一个断点,为此,您可以使用python调试器,只需将以下行放置:

import pdb; pdb.set_trace()

(仅在函数开头)

所以会是这样:

@app.route('/signup_user', methods=['POST'])
def signup_user():
#Request data from form and send to database
#Check that username isn't already taken
#if the username is not already taken  

import pdb; pdb.set_trace()
if new_user:
    users.insert_one(new_user)
    message = "Success"
    return message
#else if ussername is taken, send message to user viewable in the modal
else:
    message = "Failure"
    return message

因此,当您最终运行代码并发送请求时,您应该会看到运行python服务器的控制台,该控制台由这样的->(pdb)停止 (如果您在控制台中没有看到“(pdb)”,只需按Enter即可查看它是否出现)

如果没有停止,那么您就没有进入该功能,

否则,您就在函数中,好..现在让我们看一下并调试一下,您可以检查的第一件事是我们是否可以输入else语句..您可以逐行通过输入字母“ n”并按Enter键,因此继续进行操作,直到在else部分中输入为止,如果是这样,则实际上是在返回文本“ Failure”

如果不是,那么您就发现了问题的一部分。

您应该检查的其他一些选项:

.--尝试将参数传递给ajax函数,例如dataType:'json'

.-尝试查看是否需要为python应用启用CORS

.-逐行保持调试状态

祝你好运

答案 3 :(得分:0)

经过大量测试后,我才开始工作。 我的ajax通话需要:

event.preventDefault();

此外,我的python函数需要将重定向更改为返回值。 所以Architect是正确的。

我还注意到我没有出现在页面的源视图中,因此可能存在一些缓存问题。

所有贡献者在某种程度上都是正确的。只是我有几处不同的错误。