2012-05-23 5 views
20
ausgeführt

Ich bin mit Flask-WTF:Flask-WTF - validate_on_submit() wird nie

Hier ist meine Form ist:

from flask.ext.wtf import Form, TextField 

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

ist die Steuerung:

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

Jetzt Das Problem ist, wenn Sie meine print-Anweisungen betrachten, druckt sie immer gesendet, aber es druckt NIE gültig und validate_on_submit() wird nie ausgeführt. Warum?

Antwort

31

Sie fügen das CSRF-Feld nicht in das HTML-Formular ein.

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

Nach form.csrf_token zum Template Zugabe (docs), wird die Form wie erwartet validieren.

Fügen Sie print(form.errors) hinzu, nachdem Sie das Formular validiert haben, um die aufgetretenen Fehler zu sehen. errors wird vor der Validierung leer sein. In diesem Fall ist ein Fehler über

@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

Vielen Dank! Das war das genaue Problem! Ich habe das csrf-Feld nicht in meine Form aufgenommen. Der Versuch, es mit '{{form.csrf}}' zu lösen, hat nicht funktioniert, aber: '{{form.hidden_tag()}}' löste das Problem! Sie hatten auch Recht mit dem Fehlerdruck, gut zu wissen, wie das jetzt richtig funktioniert! – kadrian

+1

Froh, zu helfen. Wenn Sie WTForms 0.6 oder höher ausführen, wird "form.csrf" zu "form.csrf_token". Achten Sie also darauf, aber 'form.hidden_tag()' funktioniert genauso gut. –

+0

Das gab mir einen Albtraum. Danke vielmals. – skjoshi

10

können Sie Fehler drucken

print form.errors 

oder

app.logger.debug(form.errors) 

und wenn Sie CSRF-Fehlermeldung anzeigt, sollten Sie form.csrf_token in der Vorlage festgelegt.

+1

Dank für diesen Hinweis, aber ‚print form.errors‘ druckt {} . Still form.validate() gibt False zurück – kadrian

+0

Ich habe mich gefragt, wie man Flask Formular Validierung Probleme debuggen würde. Sehr gut – jxramos

0

fehlt ich die Flasche Sitzung abräumte, wenn ich vor jeder Anfrage nicht angemeldet wurde. Dies verursachte dieses Problem.

@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

Einsatz dieser nach dem Tag in der Datei Vorlage html:

{{ form.csrf_token }} 
0

Also kam ich auf, wenn ein FormField zu machen versucht, über meine FieldList in meiner Vorlage wiederholt wird. Ich hatte zwei hidden_tag Elemente eine für die FieldList Form und eine für die FieldForm Form einzubetten, die Vorlage Kommentare zu Stichwort „HIDDEN TAG“ suchen

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>