【问题标题】:Expected behavior of flask-WTForms?flask-WTForms 的预期行为?
【发布时间】:2016-01-09 00:46:51
【问题描述】:

我刚开始使用 Flask 并试图制作一个登录表单,但是当响应表单被实例化时,flask-wtf/WTForm 似乎以某种方式丢失了密码字段。 我的表格是这样的

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">

即使成功获取 name 和 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

【问题讨论】:

  • 使用form.password.data
  • 谢谢!为什么不让它成为一个答案?

标签: python flask wtforms flask-wtforms


【解决方案1】:

当您请求form.password 时,您实际上是在请求该对象的 HTML 表示,就 PasswordField 而言,包括先前在该 HTML 元素中输入的数据将是一个非常糟糕的安全漏洞,因为密码可能只需查看 HTML 源代码即可查看(在本地,或者更有可能有人通过共享的不安全 wifi 网络进行监控)

要查看包含在提交的表单元素中的数据,请使用.data 属性,例如form.password.data

【讨论】:

    猜你喜欢
    • 2015-02-09
    • 2019-01-25
    • 1970-01-01
    • 1970-01-01
    • 2021-09-03
    • 1970-01-01
    • 2018-07-26
    • 2023-03-30
    • 1970-01-01
    相关资源
    最近更新 更多