2015-10-11 6 views
0

Я только что начал с Flask и пытается сделать регистрационную форму, но flask-wtf/WTForm, похоже, каким-то образом потеряет поле пароля, когда создается форму ответа. Моя форма выглядеть как этотОжидаемое поведение колбы-WTForms?

from flask_wtf import Form 
from wtforms import StringField, PasswordField 
from wtforms.validators import DataRequired 

class LoginForm(Form): 
    name = StringField('name', validators=[DataRequired()]) 
    password = PasswordField('password', validators=[DataRequired()]) 

    def validate_password(self, field): 
     print "password field is {}".format(field) 

и вид выглядеть следующим образом:

@app.route('/login', methods=['GET', 'POST']) 
def login(): 
    form = LoginForm(request.form) 
    if form.validate_on_submit(): 
     print "** new request" 
     print "request.values = {}".format(request.values) 
     print "request.form = {}".format(request.form) 
     print "form.name = {}".format(form.name) 
     print "form.password = {}".format(form.password) 
     print "form.csrf_token = {}".format(form.csrf_token) 
     # do stuff with form.name and form.password and then render_template as appropiate 
    return render_template('login.html', form=form) 

Когда клиент вывешивает Войти Форма программа печатает это:

password field is <input id="password" name="password" type="password" value=""> # <-- value is empty! 
** new request 
request.values = CombinedMultiDict([ImmutableMultiDict([]),  ImmutableMultiDict([('csrf_token', u'1444574310##420f08dc670febba20d0a4dfd9085e5f6ad4dded'), ('password', u'hemlis'), ('name', u'kalle')])]) 
request.form = ImmutableMultiDict([('csrf_token', u'1444574310##420f08dc670febba20d0a4dfd9085e5f6ad4dded'), ('password', u'hemlis'), ('name', u'kalle')]) 
form.name = <input id="name" name="name" type="text" value="kalle"> 
form.password = <input id="password" name="password" type="password" value=""> # <-- value is empty! 
form.csrf_token = <input id="csrf_token" name="csrf_token" type="hidden" value="1444574315##24eca44ce86f86523ddf9d138f07fc306ed77a96"> 

Значение поле пароля отсутствует, даже если ему удалось получить значения для имени и csrf_token. Если я изменю тип, если поле пароля на StringField, значение пароля будет получено формой, как ожидалось, но это не является подходящим решением! :-)

Должен ли я сделать что-то еще здесь, чтобы получить поле пароля, потому что безопасность, или это ошибка где-то?

Кроме того, вот мой requirement.txt

bcrypt==2.0.0 
BeautifulSoup==3.2.1 
blinker==1.4 
cffi==1.2.1 
Flask==0.10.1 
Flask-Login==0.3.2 
Flask-Mail==0.9.1 
Flask-Principal==0.4.0 
Flask-WTF==0.12 
itsdangerous==0.24 
Jinja2==2.8 
Markdown==2.6.2 
MarkupSafe==0.23 
micawber==0.3.3 
passlib==1.6.5 
peewee==2.6.4 
pycparser==2.14 
six==1.10.0 
Werkzeug==0.10.4 
wheel==0.24.0 
WTForms==2.0.2 
+1

use 'form.password.data' – Doobeh

+1

Спасибо! Почему бы вам не ответить? – Kalle

ответ

2

Когда вы просите form.password вы на самом деле просите для HTML представления этого объекта, с точкой зрения PasswordField включая ранее введенные данные в этом HTML элементе будет быть довольно плохой дырой в безопасности, поскольку пароль можно просмотреть, просто взглянув на исходный код HTML (локально или, скорее, кто-то, наблюдающий за общей незащищенной сетью Wi-Fi)

Для просмотра данных, которые включены в представленный элемент формы, используйте .data, например form.password.data.

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