Angularjs + Flask-wtf: неверный запрос 400

У меня возникла очень странная проблема с wtf-формами, когда я отправляю запрос, используя $http-модуль angularjs. При инициализации WTForm я получаю ошибку Bad request: 400. В целях тестирования я отключил защиту csrf. Я серьезно понятия не имею, где искать проблему. Ниже приведен минимальный сбой:

Служба Angularjs отправляет запрос:

var data = new FormData();
data.append('surname', _gifter.surname);
data.append('lastname', _gifter.lastname);
data.append('email', _gifter.email);
data.append('email_confirm', _gifter.email_confirm);
data.append('prize', gift.prize);

$http.post('ajax/claim/' + DataProvider.gift.id + '/', data)

Маршрут фляги:

@app.route('/ajax/claim/<int:gift_id>/', methods = ['POST'])
def claim_gift(gift_id):
    print("request:" + request.data)
    claim_form = ClaimGiftForm(csrf_enabled=False)
    return 'success'

WTFФорма:

class ClaimGiftForm(Form):
    surname = TextField(
        validators=[validators.Required()])
    lastname = TextField(
        validators=[validators.Required()])
    email = EmailField(
        validators = [
            validators.email(),
            validators.Required()])
    email_confirm = EmailField(
        validators = [
            validators.Required(),
            validators.EqualTo()])
    prize = IntegerField()

Когда я печатаю запрос (см. «Flask route»), данные вроде в порядке - все передается правильно. Но при инициализации формы я получаю вышеупомянутую ошибку.

Edit1: я только что узнал, что по какой-то причине request.form MultiDict пуст, хотя request.data содержит ожидаемые данные. Однако я понятия не имею, почему это так.

Edit2: pprint(request.data) дает:

-----------------------------109386632915471364402090498247\r\nContent-Disposition: form-data; name="surname"\r\n\r\ntheName\r\n
-----------------------------109386632915471364402090498247\r\nContent-Disposition: form-data; name="lastname"\r\n\r\ntheLastname\r\n
-----------------------------109386632915471364402090498247\r\nContent-Disposition: form-data; name="email"\r\n\r\[email protected]\r\n
-----------------------------109386632915471364402090498247\r\nContent-Disposition: form-data; name="email_confirm"\r\n\r\[email protected]\r\n
-----------------------------109386632915471364402090498247\r\nContent-Disposition: form-data; name="prize"\r\n\r\n12\r\n
-----------------------------109386632915471364402090498247--\r\n'

person theCalcaholic    schedule 15.06.2015    source источник


Ответы (2)


Ваш JavaScript имеет email_confirmed, но поле формы email_confirm.

person Celeo    schedule 15.06.2015
comment
Я просто фейспалмил так сильно. Завтра посмотрю, исправит ли это. - person theCalcaholic; 16.06.2015
comment
Хорошо, к сожалению, это была просто опечатка в вопросе. Я отредактировал его соответственно - person theCalcaholic; 16.06.2015

Это был заголовок запроса ajax. Мне нужно было добавить объект конфигурации заголовка:

{
    withCredentials: true,
    headers: {'Content-Type': undefined},
    transformRequest: angular.identity
}

Весь запрос теперь выглядит так:

$http.post('ajax/claim/' + DataProvider.gifts[index].id + '/', data, {
    withCredentials: true,
    headers: {'Content-Type': undefined},
    transformRequest: angular.identity
).success(...);

Считаю этот вопрос закрытым.

person theCalcaholic    schedule 16.06.2015