Flask Ajax Error 400 - PullRequest
       4

Flask Ajax Error 400

0 голосов
/ 03 мая 2018

я получаю ошибку 400 при публикации. я использую флешку и 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

и я не могу на всю жизнь понять, что не так ...

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Как я уже упоминал в своем комментарии, объект данных представляет собой объект json, и в отличие от объектов javascript ключи должны быть строками. См. этот ref

Измените ваш объект данных на (при условии, что ваши значения являются допустимыми типами данных JSON (строка, число, объект, массив, логическое значение или ноль))

РЕДАКТИРОВАТЬ Я отвечал на этот вопрос и понял, что основная проблема может заключаться в том, что ваши данные были закодированы с помощью jquery. Если вы приведете его в соответствие, как показано ниже, он должен работать. Попробуйте на свой оригинальный код

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, потому что в моем приложении для тестирования у меня уже определен сеанс)

0 голосов
/ 04 мая 2018

Я тоже внимательно посмотрел, но не смог найти ничего очевидного. Я сделал небольшой рабочий пример, который делает именно то, что вы надеетесь сделать. Попробуйте добавить что-то в пример, пока вы его не сломаете.

from flask import Flask, render_template_string, request, jsonify, url_for

app = Flask(__name__)


@app.route('/', methods=['GET', 'POST'])
def index():
    if request.method == 'POST':
        info = request.form['question']
        print(info)
        return jsonify({'what_you_sent': info})

    return render_template_string('''
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>title</title>
</head>
<body>
<script src="https://code.jquery.com/jquery-3.3.1.js"></script>
<div></div>
<script>
 $.ajax({
        url: "/",
        type: "POST",
        data: {
          question: 'hello?',
          answer1: 'hi',
         },
        success: function(data){
            alert(data.what_you_sent);},
        error: function(xhr, textStatus, error){
            alert('such error')}
    });
</script>
</body>
</html>
''')


app.run()

Просто общий совет при отладке 400 ошибок, просто обращайтесь к элементам формы один за другим, вместо того, чтобы напрямую применять их к модели или чему-либо еще, их легче обнаружить таким образом.

как:

print(request.form['question'])
print(request.form['answer1'])
etc...

Также на всякий случай очистите кеш браузера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...