2015-06-15 65 views
1

我用wtf-forms发送了一个非常奇怪的问题,我使用angularjs $ http-module发送了一个请求。初始化WTForm时,我收到一个错误的请求:400错误。出于测试目的,我禁用了csrf保护。我真的不知道在哪里寻找问题。以下是最小的失败:Angularjs + Flask-wtf:错误的请求400

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' 

WTForm:

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() 

当我打印的要求(见在'烧瓶路线')数据似乎是确定的 - 一切都正确传输。但是初始化表单后,我得到了上述错误。

EDIT1:我刚刚发现,由于某种原因,该request.form MultiDict是空的,allthough 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' 

回答

1

你的JavaScript有email_confirmed但形式的字段是email_confirm

+0

我只是那么刻薄。如果这能解决问题,我明天就会看到。 – theCalcaholic

+0

好吧,不幸的是,这只是一个错误的问题。我相应地编辑了它 – theCalcaholic

1

这是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(...); 

我认为这个问题是关闭的。