首页 > 解决方案 > 烧瓶 Ajax 错误 400

问题描述

我在发布时收到错误 400。我在后端使用了flask和sqlalchemy,非常简单的javascript和jquery是JS:

    $.ajax({
        url: "/create",
        type: "POST",
        data: {
          question: question,
          answer1: answer1,
          answer2: answer2,
          answer3: answer3,
          answer4: answer4,
          answer5: answer5,
          answer6: answer6,
          congress: congress,
          session: session,
          date: date,
          lecture: lecture,
          correct: correct
        },
        success: function(){
            console.log("sent");
        }, error: function(xhr, textStatus, error){
            console.log(xhr.statusText);
            console.log(textStatus);
            console.log(error);
            }
    });
}

这是烧瓶代码:

@app.route('/create', methods=['GET', 'POST'])
def cre():
post = QuestionClass(congress=str(request.form['congress']), 
session=str(request.form['session']),
                     date=str(request.form['date']), 
lecture=str(request.form['lecture']),
                     question=str(request.form['question']), 
answer1=str(request.form['answer1']),
                     answer2=str(request.form['answer2']), answer3=str(request.form['answer3']),
                     answer4=str(request.form['answer4']), answer5=str(request.form['answer5']),
                     )

engine = create_engine(sqlite:///DB.db', echo=True)
Session = sessionmaker(bind=engine)
sqlsession = Session()
sqlsession.add(post)
sqlsession.commit()
return 1

而且我一生都无法弄清楚出了什么问题...

标签: javascriptpythonpostflask

解决方案


正如我在评论中提到的,数据对象代表的是 json 对象,与 javascript 对象不同,键必须是字符串,请参阅此 ref

将您的数据对象更改为(假设您的值是有效的 JSON 数据类型(字符串、数字、对象、数组、布尔值或 null))

编辑我正在回答这个问题,并意识到主要问题可能是您的数据是由 jquery 进行 url 编码的。如果你像下面这样对它进行字符串化,它应该可以工作。在您的原始代码上尝试

data: JSON.stringify({
          "question": question,
          "answer1": answer1,
          "answer2": answer2,
          "answer3": answer3,
          "answer4": answer4,
          "answer5": answer5,
          "answer6": answer6,
          "congress": congress,
          "session": session,
          "date": date,
          "lecture": lecture,
          "correct": correct
        }),

好的,我会让你的烧瓶更复杂一点,但这是有充分理由的。我将制作一个 wtf 表单(您可以制作一个普通表单,但我喜欢 wtf 的附加功能,例如验证等)

class QuestionForm(FlaskForm):
    question = StringField('question', [validators.InputRequired(message="Please enter a valid entry")])
    answer1 = StringField('answer1', [validators.InputRequired(message="Please enter a valid entry")])
    answer2 = StringField('answer2', [validators.InputRequired(message="Please enter a valid entry")])
    answer3 = StringField('answer3', [validators.InputRequired(message="Please enter a valid entry")])
    answer4 = StringField('answer4', [validators.InputRequired(message="Please enter a valid entry")])
    answer5 = StringField('answer5', [validators.InputRequired(message="Please enter a valid entry")])
    answer6 = StringField('answer6', [validators.InputRequired(message="Please enter a valid entry")])
    congress = StringField('congress', [validators.InputRequired(message="Please enter a valid entry")])
    session = StringField('session', [validators.InputRequired(message="Please enter a valid entry")])
    date = StringField('date', [validators.InputRequired(message="Please enter a valid entry")])
    lecture = StringField('lecture', [validators.InputRequired(message="Please enter a valid entry")])
    correct = StringField('correct', [validators.InputRequired(message="Please enter a valid entry")])

如果您使用 wtf,请务必进行相关导入

from flask_wtf import FlaskForm
from wtforms import Form, BooleanField, StringField, IntegerField, validators, SelectField, TextAreaField, HiddenField

然后我将使用 werkzeug.datastructures 访问 json 数据(我从导入开始,如果它在不同的文件中,也导入表单from forms import QuestionForm),然后访问表单的所有值。我返回一个字符串中的所有值只是为了确保我收到它们,我相信你会知道如何从那里保存到你的数据库

from werkzeug.datastructures import MultiDict
@app.route('/create', methods=['POST'])
def cre():
    form_data = MultiDict(mapping=request.json)
    form = QuestionForm(form_data)
    if request.is_json:
        question= form.question.data
        answer1= form.answer1.data
        answer2= form.answer2.data
        answer3= form.answer3.data
        answer4= form.answer4.data
        answer5= form.answer5.data
        answer6= form.answer6.data
        congress= form.congress.data
        ssession= form.session.data
        date= form.date.data
        lecture= form.lecture.data
        correct= form.correct.data
    return str(question+' '+answer1+' '+answer2+' '+answer3+' '+answer4+' '+answer5+' '+answer6+' '+congress+' '+ssession+' '+date+' '+lecture+' '+correct)

如果您希望根据您在表单上指定的验证器验证数据,您可以在if form.validate_on_submit():之后添加if request.is_json:

我能够得到我放入 json 对象中的所有值的响应。我敢肯定,如果您找到适合您的示例,您将能够从那里进行调试(我使用了 ssession,因为在我的测试应用程序中我已经定义了会话)


推荐阅读