javascript - 烧瓶 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
而且我一生都无法弄清楚出了什么问题...
解决方案
正如我在评论中提到的,数据对象代表的是 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,因为在我的测试应用程序中我已经定义了会话)
推荐阅读
- tensorflow - tfp.mcmc.HamiltonianMonteCarlo 不在 TensorFlow Probability 中工作
- python - 生成最多 2 个重复的 3 个数字的列表
- r - 在r数据表中添加总行
- python - 根据行间变化的计算创建一个新列?
- c++ - 错误代码:“数组下标的无效类型'int [int]'”
- sql - 简单的聚合查询运行缓慢
- javascript - 带有令牌形式离子本地存储的 ngx-socket-io
- mysql - 如何在mysql中使用动态表名和动态列名编写选择查询
- javascript - 有效地使用节点获取,获取无效的 json 响应正文错误*仅*我第一次查询服务器时
- oracle - 入队资源使用百分比 108.65% 对数据库来说太高了