2016-02-18 60 views
0

我無法獲得某個簡單的Flask WTForm驗證。Flask WTForms表單不驗證

經過幾天的鬥爭,我嘗試了所有我能想到的。一般來說,我是Flask和Web編程的新手。

這裏是我的代碼的精簡但工作版本。測試代碼的唯一操作(除了提交表單)是將消息打印到終端。運行時,它的外觀:

Screenshot of running code

這是views.py:

# -*- coding: utf_8 -*- 
... 

@app.route('/test/new/', methods=['GET','POST']) 
def newTest(): 
    form = TestForm(request.form) 
    if form: 
     print 'request.form.get(\'name\') is %s' % (request.form.get('name'),) 
    if request.method == 'POST': 
     print 'in newTest(), request is POST' 
     if form.validate(): 
      print 'form validates' 
      return redirect(url_for('allTests')) 
     else: 
      print 'form does not validate' 
      return render_template('newTest.html', form=form) 
    else: 
     return render_template('newTest.html', form=form) 

這裏的forms.py:

class TestForm(Form): 
    name = StringField(u"Test Name", [validators.InputRequired()]) 
    address = StringField(u"Test Address", [validators.InputRequired()]) 

    submit = SubmitField(u"Submit") 

models.py:

from sqlalchemy import Column, Integer, Unicode 
from sqlalchemy.ext.declarative import declarative_base 

Base = declarative_base() 

class TestModel(Base): 

    __tablename__ = 'test' 

    name = Column(Unicode(80), nullable = False) 
    id = Column(Integer, primary_key = True) 
    address = Column(Unicode(80), nullable = False) 

和T他的模板:

<html lang="en"> 
<head> 
    <meta charset="utf-8"> 
    <title>New Test</title> 
</head> 
<body> 
    <div> 
     <form action="{{ url_for('newTest') }}" method="POST" name="add_rest"> 
     <ul> 
      <li>Name: {{ form.name }}</li> 
      <li>Address: {{ form.address }}</li> 
     </ul> 
     <input type="submit" value="Create"> 
    </div> 
</body> 
</html> 

輸出(終端),我得到當我點擊上面的「創建」:

request.form.get('name') is Vinnie 
in newTest(), request is POST 
form does not validate 
10.0.2.2 - - [18/Feb/2016 02:34:51] "POST /test/new/ HTTP/1.1" 200 - 

那麼瀏覽器將重新顯示的形式和內容。

我假設我錯過了一些簡單的東西,但是我一直沒能弄明白這一點對於我的生活。

如通過「樹」的代碼的結構是:

code structure via tree

我會任何幫助非常感謝!

回答

3

您是否嘗試在您的HTML文件中插入CSRF令牌?

例如,將以下內容添加到Jinja模板中?

<body> 
    <div> 
     <form action="{{ url_for('newTest') }}" method="POST" name="add_rest"> 
     <!-- Added line --> 
     {{ form.csrf_token }} 
     <ul> 
      <li>Name: {{ form.name }}</li> 
      <li>Address: {{ form.address }}</li> 
     </ul> 
     <input type="submit" value="Create"> 
    </div> 
</body> 

This SO後可能是有用的。

您還可以查看官方文檔here,它表示validate()函數需要使用CSRF令牌。

+0

Yesssss !!!非常感謝!那(並且照顧我無法看到的其他錯誤,因爲validate()代碼從未執行)修復它。這一直在困擾着我好幾天。 – jazcap53