flask 问题得到 ImmutableMultiDict([])

问题描述 投票:0回答:1

亲爱的, 我是 Flask 的新手,我在发送 ajax 请求时遇到了问题,因为数据是从 Ajax 发送的,当我验证它时,我得到了

ImmutableMultiDict([])
,因为输入字段为空时引发了验证错误。我需要帮助来解决这个问题。 问候。

这是我的代码:

@users.route('/updateUserPassword',methods=['POST'])
@login_required
def updateUserPassword() :
    message=''
    status=''
    print(request.form)
    passwordform = changeUserPassword(request.form)
    if passwordform.validate_on_submit() :
        id        = request.form.get('id')
        action    = request.form.get('action')
        password  = request.form.get('password')
        pass_confirm  = request.form.get('pass_confirm')
 
         
    else:   
       # return jsonify({'status':'error',
              #   message:[{passwordform[field].label.text: ', '.join(errors)} for field, errors in passwordform.errors.items()]})
        errors = {}
        for field, field_errors in passwordform.errors.items():
            errors[field] = [str(error) for error in field_errors]
        return jsonify({'error': "error submit data ", 'message': errors})

我的js代码是:

$("#editUserForm").submit(function(){

var formData = $(this).serialize();
var allData  = formData + "&action=editPass";
$.ajax({
url: "{{ url_for('users.updateUserPassword') }} ",
  type:"POST",
  data: JSON.stringify(allData),
  contentType: 'application/json',

  beforeSend:function(){
  },
  statusCode: {
      404: function() {
          alert( "page not found" );
      },
  },
  success:function(valdata) {
  
      if(valdata['status'] == "success")
      {
          $("#updatePasswordResult").html(valdata['message']);
          setTimeout(function(){$('#changepassword').modal('hide');}, 2000);
      }else{
        var errors = valdata['message'];
                          for (var field in errors) {
                              if (errors.hasOwnProperty(field)) {
                                  var errorMessages = errors[field];
                                  for (var i = 0; i < errorMessages.length; i++) {
                                      $('#updatePasswordResult').append('<p>' + field + ': ' + errorMessages[i] + '</p>');
                                  }
                              }
                            }

        //  $("#updatePasswordResult").html(valdata['message']);
      }
  }
});
return false;
});

验证码是:

class changeUserPassword(FlaskForm):

    password = PasswordField("Password",validators=[DataRequired()])                
    pass_confirm = PasswordField('Confirm Password',validators=[DataRequired(),EqualTo('password',message='Passwords must match!')])
   
    submit = SubmitField('Submit')  
javascript ajax flask flask-sqlalchemy flask-wtforms
1个回答
0
投票

当您发送 AJAX 请求时,您正在发送一个带有标题“Content-Type: application/json”的 JSON,并且在您的 Flask 代码中您尝试从

request.form
读取。

如果你想读取在 Flask 中发送的 JSON,那么你需要调用

request.json
。所以它可以解析 JSON。

from flask import request

def update_user_password():
    print(request.json)
    # {'id': 1, 'action': 'editPass', 'password': 'hunter2', 'pass_confirm': 'hunter2'}

    user_id = request.json.get("id") # 1
    action = request.json.get("action") # "editPass"
    password = request.json.get("password") # "hunter2"
    pass_confirm = request.json.get("pass_confirm") # "hunter2"
© www.soinside.com 2019 - 2024. All rights reserved.