2013-05-29 38 views
2

提交包含動態填充的SelectField的表單時出現問題。由於某些原因,當Flask嘗試驗證CSRF令牌時,SelectField在表單中時總是失敗。當我從表單中刪除SelectField時,它成功驗證了CSRF令牌。啓用CSRF保護的Flask-WTF SelectField

有沒有人遇到過這種行爲?

編輯

形式:

class AddToReportForm(Form): 
    selectReportField = SelectField(u'Reports',choices=[('test1','test')]) 

    def __init__(self, *args, **kwargs): 
     """ 
     Initiates a new user form object 
     :param args: Python default 
     :param kwargs: Python default 
     """ 
     Form.__init__(self, *args, **kwargs) 




    def validate(self,id_list): 
     rv = Form.validate(self) 

     if not rv: 
      print False 
      #Check for the CSRF Token, if it's not there abort. 
      return False 

     print True 
     return True 

的Jinja2:

<form method=post name="test"> 
{{ form.hidden_tag()}} 




    {{ form.selectReportField }} 
    <a href="#" onclick="$(this).closest('form').submit()" class="button save">Add to report</a> 

</form> 

渲染:

form = AddToReportForm() 
return render_template('random',title='add reports',form=form 
+0

你可以張貼一些代碼? –

+0

是的,我會做出一個概念:) –

+0

更新了一些代碼 –

回答

2

我依然看不到任何連接在SelectField和CSRF之間。該validate方法是有點可疑,額外的參數會跳閘以下測試用例,但因爲它的立場,這似乎只是很好地工作:

from flask import Flask, render_template_string 
from flaskext.wtf import Form, SelectField 

app = Flask(__name__) 
app.debug = True 
app.secret_key = 's3cr3t' 


class AddToReportForm(Form): 
    selectReportField = SelectField(u'Reports', choices=[('test1', 'test')]) 


@app.route('/test', methods=['GET', 'POST']) 
def test(): 
    form = AddToReportForm() 
    if form.validate_on_submit(): 
     print 'OK' 
    return render_template_string('''\ 
<form method=post name="test"> 
{{ form.hidden_tag()}} 
{{ form.selectReportField }} 
<input type="submit"> 
</form> 
''', form=form) 


app.run(host='0.0.0.0') 
+0

問題最終成爲數據庫中id應該被強制用於SelectField的類型轉換。 –

3

你在哪裏設置SECRET _鍵?它必須是可用無論是在Form類:

class AddToReportForm(Form): 
    selectReportField = SelectField(u'Reports',choices=[('test1','test')]) 
    SECRET_KEY = "myverylongsecretkey" 

    def __init__(self, *args, **kwargs): 
     """ 
     Initiates a new user form object 
     :param args: Python default 
     :param kwargs: Python default 
     """ 
     Form.__init__(self, *args, **kwargs) 
    def validate(self,id_list): 
     rv = Form.validate(self) 

     if not rv: 
      print False 
      #Check for the CSRF Token, if it's not there abort. 
      return False 
     return True 

或應用程序中的引導:

app = Flask(__name__) 
app.secret_key = 'myverylongsecretkey' 

或在構造函數中:

form = AddToReportForm(secret_key='myverylongsecretkey') 
return render_template('random',title='add reports',form=form) 
+0

祕密密鑰在應用程序的配置文件中設置,它適用於所有表單,除了使用SelectField的表單。 –

+0

不完全確定,因爲我對Flask生態系統還不太瞭解,但總的來說,將密鑰直接放入源代碼被認爲是一種不好的做法。 – chiffa

0

推薦使用:

app.secret_key = 'key here' # key user defined