2016-02-18 5 views
0

Я не могу получить определенную простую флэшку WTForm для проверки.Форма флага WTForms не подтверждается

После нескольких дней борьбы я пробовал все, что мог придумать. Я новичок в Flask и веб-программировании в целом.

Вот урезанная, но рабочая версия моего кода. Единственным действием тестового кода (кроме отправки формы) является печать сообщений на терминал. Его внешний вид при работе:

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) 

и т он шаблон:

<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

Вы пытались вставить маркер CSRF в свой HTML-файл?

Например, добавив следующий к вашему шаблону 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

Смежные вопросы