2012-05-23 23 views
20

asla çalıştırılmaz ŞimdiFlask-WTF validate_on_submit() Ben Flask-WTF kullanıyorum

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

: Burada

from flask.ext.wtf import Form, TextField 

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

kontrolcüsüdür Sorun şu ki, baskı ifadelerime bakarsanız, her zaman gönderilir, ancak ASLA geçerli yazdırmaz ve validate_on_submit() hiçbir zaman yürütülmez. Niye ya?

cevap

31

HTML formunda CSRF alanını eklemiyorsunuz. beklendiği gibi

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

şablonu (docs) için form.csrf_token ilave edildikten sonra, bir şekilde doğrular.

Yükseltilmiş hataları görmek için formu doğruladıktan sonra print(form.errors) ekleyin. Doğrulamadan önce errors boş olacaktır. Bu durumda, her istek önce giriş yapmış değildi, ben şişe oturumu temizliyordum

@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

Çok teşekkür ederim! Bu tam bir problemdi! Csrf alanını formuma dahil etmedim. '{{Form.csrf}} ile çözmeyi denedim işe yaramadı, ama yapıyordu: '{{form.hidden_tag()}}' sorunu çözdü! Hatalı baskı konusunda da haklıydınız, şimdi nasıl düzgün çalıştığını bilmek güzel! – kadrian

+1

Yardım için sevindim. Eğer WTForms 0.6 ya da daha sonra çalıştırıyorsanız, 'form.csrf'' form.csrf_token' oldu, bunun için dikkat edin, ancak 'form.hidden_tag()' da çalışır. –

+0

Bu bana kabus veriyordu. Çok teşekkürler. – skjoshi

10

hataları

print form.errors 

veya

app.logger.debug(form.errors) 

dökümünü alabilir ve-hata csrf var ise, size şablonunda form.csrf_token belirlesin.

+1

teşekkürler, ama zorundaydı . Hala form.validate() yanlış – kadrian

+0

döndürür Flask form doğrulama sorunları hata ayıklama hakkında nasıl giderdim merak ediyordum. Çok iyi – jxramos

0

eksik hakkında bir hata var. Bu, bu soruna neden oldu.

@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

insert bu şablon html dosyasında etiketinden sonra: my FieldList benim şablonun üzerine yinelenilen bir FormField işlemek çalışırken

{{ form.csrf_token }} 
0

Bunu geldi. Ben 'baskı form.errors' baskılar {} anahtar "GİZLİ TAG" için şablon yorumlarınızı aramak, FieldForm formu için iki hidden_tag elemanları FieldList formu için diğeri gömmek bu ipucu

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> 
İlgili konular