(提问)使用Ajax发送post的请求的时候报错(404) bad request 提示的报错位置直接是jQuery,想问问大佬问题出在哪儿

这是一个修改密码的功能:

python代码:

class ResetPwdView(views.MethodView):
    decorators = [login_required]
    def get(self):
        return render_template('cms/cms_resetpwd.html')

    def post(self):
        form = ResetPwdForm(request.form)
        if form.validate():
            if g.cms_user.check_password(form.oldpwd.data):
                g.cms_user.password = form.newpwd.data
                db.session.commit()
                print(jsonify({'code': 200, 'message': ''}))
                jsonify({'code': 200, 'message': ''})
            return jsonify({'code': 400, 'message': '旧密码错误!'})
        return jsonify({'code': 400, 'message': form.get_error()})


bp.add_url_rule('/login', view_func=LoginView.as_view('login'))
bp.add_url_rule('/resetpwd', view_func=ResetPwdView.as_view('resetpwd'))

Ajax(这里的alajax是对原有ajax的封装)

ajax.post({
            'url': '/cms/resetpwd',
            'data': {
                'oldpwd': oldpwd,
                'newpwd': newpwd,
                'newpwd2': newpwd2
            },
            'success': function (data) {
                console.log(data);
            },
            'fail': function (error) {
                console.log(error);
            }
        });

zlajax(封装是用的别人,是没有问题的,但是这里还是贴出来)

var zlajax = {
	'get':function(args) {
		args['method'] = 'get';
		this.ajax(args);
	},
	'post':function(args) {
		args['method'] = 'post';
		this.ajax(args);
	},
	'ajax':function(args) {
		// 设置csrftoken
		this._ajaxSetup();
		$.ajax(args);
	},
	'_ajaxSetup': function() {
		$.ajaxSetup({
			'beforeSend':function(xhr,settings) {
				if (!/^(GET|HEAD|OPTIONS|TRACE)$/i.test(settings.type) && !this.crossDomain) {
                    var csrftoken = $('meta[name=csrf-token]').attr('content');
                    xhr.setRequestHeader("X-CSRFToken", csrftoken)
                }
			}
		});
	}
};

引用的bootstrap的jQuery文件

<head>
    <meta charset="UTF-8">
    <meta name="csrf_token" content="{{ csrf_token() }}">
    <title>{% block title %}{% endblock %}</title>
    <script src="http://cdn.bootcss.com/jquery/3.1.1/jquery.min.js"></script>
    <link href="http://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
    <script src="http://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
    <script src="{{ static('common/zlajax.js') }}"></script>
    <link rel="stylesheet" href="{{ static('cms/css/cms_base.css') }}">
    <script src="{{ static('cms/js/cms_base.js') }}"></script>
    {% block head %}{% endblock %}
</head>

表单

<form action="" method="post">
{#        <input type="hidden" name="csrf_token" value="{{ csrf_token() }}">#}
        <div class="form-container">
            <div class="form-group">
                <div class="input-group">
                    <span class="input-group-addon">旧密码</span>
                    <input type="password" class="form-control" name="oldpwd" placeholder="请输入旧密码">
                </div>
            </div>
            <div class="form-group">
                <div class="input-group">
                    <span class="input-group-addon">新密码</span>
                    <input type="password" class="form-control" name="newpwd" placeholder="请输入新密码">
                </div>
            </div>
            <div class="form-group">
                <div class="input-group">
                    <span class="input-group-addon">确认密码</span>
                    <input type="password" class="form-control" name="newpwd2" placeholder="请确认新密码">
                </div>
            </div>
            <div class="form-group">
                <button class="btn btn-primary" id="submit">立即保存</button>
            </div>
        </div>
    </form>

之前没有这样的错误,但是现在不行了我也不知道为什么

上面的ajax.post真实的代码是alajax.post , 写错了。。

没有人能帮忙看看吗,我实在没找到问题在哪儿

class ResetPwdView(views.MethodView):
    # ...
    
    def post(self):
        form = ResetPwdForm(request.form)
        if form.validate():
            if g.cms_user.check_password(form.oldpwd.data):
                g.cms_user.password = form.newpwd.data
                db.session.commit()
                print(jsonify({'code': 200, 'message': ''}))
                # 下面这一行并没有 return ,所以即使密码正确,也不会返回 200 响应
                # 而是返回再下一行的 400 响应
                jsonify({'code': 200, 'message': ''})
            return jsonify({'code': 400, 'message': '旧密码错误!'})
        # 表单提交产生的 400 响应有可能是验证未通过自动返回的
        # 你可以在这里添加一行打印表单的验证错误信息,这样可以判断表单是否通过验证:
        print(form.errors)
        return jsonify({'code': 400, 'message': form.get_error()})
2 Likes

感谢,之前号找不回来了,我忘了我用什么登录的了。。。

哦吼,找回来了