2012-05-23 6 views
20

실행되지 않습니다 이제플라스크-WTF validate_on_submit이() 나는 플라스크-WTF를 사용하고

@book.route('/book/new', methods=['GET', 'POST']) 
def customers_new(): 
    form = BookNewForm() 
    if form.is_submitted(): 
     print "submitted" 
    if form.validate(): 
     print "valid" 
    if form.validate_on_submit(): 
     flash("Successfully created a new book") 
     return redirect(url_for('.books_show')) 
    return render_template('views/books_new.html', form=form) 

: 여기

from flask.ext.wtf import Form, TextField 

class BookNewForm(Form): 
    name = TextField('Name') 

는 컨트롤러 문제는 내 print 서술문을 보면 제출 된 내용을 항상 출력하지만 결코 인쇄되지 않으며 validate_on_submit()이 실행되지 않는다는 것입니다. 왜?

답변

31

HTML 양식에 CSRF 필드를 삽입하지 않습니다. 예상대로

<form method=post> 
    {{ form.csrf_token }} 
    {{ form.name }} 
    <input type=submit> 
</form> 

템플릿 (docs)에 form.csrf_token을 첨가 한 후, 형태 검증한다.

양식을 확인한 후 print(form.errors)을 추가하면 발생한 오류를 볼 수 있습니다. errors은 유효성 검사 전에 비어 있습니다. 이 경우, 나는 모든 요청하기 전에 로그인하지 않은 경우 내가 플라스크 세션을 삭제했다

@book.route('/book/new_no_csrf', methods=['GET', 'POST']) 
def customers_new_no_csrf(): 
    form = BookNewForm() 
    print(form.errors) 

    if form.is_submitted(): 
     print "submitted" 

    if form.validate(): 
     print "valid" 

    print(form.errors) 

    if form.validate_on_submit(): 
     flash("Successfully created a new book") 
     return redirect(url_for('.books_show')) 

    return render_template('books_new.html', form=form) 
{} 
submitted 
{'csrf_token': [u'CSRF token missing']} 
127.0.0.1 - - [29/May/2012 02:01:08] "POST /book/new_no_csrf HTTP/1.1" 200 - 
127.0.0.1 - - [29/May/2012 02:01:08] "GET /favicon.ico HTTP/1.1" 404 - 

I created an example on GitHub.

+4

정말 고마워요! 이것은 정확한 문제였습니다! 내 양식에 csrf 필드를 포함시키지 않았습니다. '{{form.csrf}} '로 해결하려했지만 작동하지 않았습니다 :'{{form.hidden_tag()}}'이 문제를 해결했습니다! 당신은 오류 인쇄에 대해서도 옳았는데, 그것이 현재 어떻게 제대로 작동하는지 알 수 있습니다! – kadrian

+1

도와 드리겠습니다. WTForms 0.6 이상을 실행하고 있다면'form.csrf'가'form.csrf_token'이 되었으니주의하십시오. 그러나'form.hidden_tag()'도 마찬가지로 작동합니다. –

+0

이것은 나에게 악몽을주고 있었다. 고마워. – skjoshi

10

당신은 오류

print form.errors 

또는

app.logger.debug(form.errors) 

를 인쇄 할 수 있습니다 당신이 오류를 CSRF있어, 당신은 당신의 템플릿에 form.csrf_token을 설정해야합니다.

+1

감사하지만했다 . 여전히 form.validate()는 False를 반환합니다. – kadrian

+0

플라스크 폼 유효성 검사 문제를 디버깅하는 방법에 대해 궁금합니다. 아주 좋아 – jxramos

0

누락에 대한 오류가있다. 이 문제가 발생했습니다.

@main.before_request 
def before_request(): 
    if not current_user.is_authenticated(): 
     # TODO clean sessions may cause CSRF missing issue 
     session.clear() 
     print "Session Cleared" 
     return redirect(url_for('auth.login')) 
2

삽입이 템플릿 HTML 파일의 태그 후 : 내 FieldList 내 템플릿을 통해 반복되는 FormField을 렌더링 할 때

{{ form.csrf_token }} 
0

나는이 가로 질러왔다. 나는 '인쇄 form.errors'인쇄 {} 키워드 "HIDDEN TAG"에 대한 템플릿 주석을 검색하십시오 FieldForm 양식이 hidden_tag 요소 FieldList 양식 하나 하나 포함이 힌트

class ParamRangeForm(FlaskForm): 
    minX = FloatField() 
    maxX = FloatField() 

class ParamRangesForm(FlaskForm): 
    paramRanges = FieldList(FormField(ParamRangeForm)) 
    submit  = SubmitField('Submit') 

    def loadParams(self) : 
     for paramName in ["p1" , "p2" , "p3", "p4"] : 
      prf = ParamRangeForm() 
      prf.minX = -100.9#float('-inf') 
      prf.maxX = 100.5#float('-inf') 
      self.paramRanges.append_entry(prf) 

... 

    <form action="" method="POST" enctype="multipart/form-data"> 
    {{ rangesForm.hidden_tag() }} <!--#### HIDDEN TAG #1 --> 
    <table> 
     <!--Print Column Headers--> 
     <thead> 
     <tr> 
     <th class="ColumnHeader">Parameter</td> 
     <th class="ColumnHeader">Min</td> 
     <th class="ColumnHeader">Max</td> 
     </tr> 
     </thead> 

     <!--Print Parameter Rows--> 
     <tbody> 
     {% for paramRange in rangesForm.paramRanges %} 
     <tr> 
      {{ paramRange.hidden_tag() }} <!--#### HIDDEN TAG #2 --> 
      <td>p{{ loop.index }}</td> 
      <td>{{ paramRange.minX }}</td> 
      <td>{{ paramRange.maxX }}</td> 
     </tr> 
     {% endfor %} 
     </tbody> 
    </table> 
    </div> 
    {{ rangesForm.submit() }} 
    </form> 
관련 문제