Flask 在wtforms中填充密码字段

Flask 在wtforms中填充密码字段,flask,wtforms,Flask,Wtforms,是否可以在flask中的wtforms中填充密码字段 我试过这个: capform = RECAPTCHA_Form() capform.username.data = username capform.password.data = password 表单的定义如下: class RECAPTCHA_Form(Form): username = TextField('username', validators=[DataRequired()]) password = Pas

是否可以在flask中的wtforms中填充密码字段

我试过这个:

capform = RECAPTCHA_Form() 
capform.username.data = username
capform.password.data = password
表单的定义如下:

class RECAPTCHA_Form(Form):
    username = TextField('username', validators=[DataRequired()])
    password = PasswordField('password', validators=[DataRequired()])
    remember_me = BooleanField('Remember me.')
    recaptcha = RecaptchaField()        
模板如下所示:

<form method="POST" action="">
  {{ form.hidden_tag() }}
  {{ form.username(size=20) }}
  {{ form.password(size=20) }}
  {% for error in form.recaptcha.errors %}
     <p>{{ error }}</p>
  {% endfor %}
  {{ form.recaptcha }}
  <input type="submit" value="Go">
</form>             

{{form.hidden_tag()}}
{{form.username(size=20)}
{{form.password(大小=20)}
{form.recaptcha.errors%%中的错误为%
{{error}}

{%endfor%} {{form.recaptcha}}
我尝试将
密码字段
更改为
文本字段
,然后它就可以工作了


在wtforms中填充密码字段是否有一些特殊限制?

我在Flask和Flask应用程序中发现,一般来说,源代码是文档。实际上,在默认情况下,似乎无法填充该字段。您可以传递一个参数
hide\u value
来防止这种行为

这是一个很好的调用,因为如果可以填充字段,则可以访问原始密码。。。这可能很危险

class PasswordInput(Input):
    """
    Render a password input.

    For security purposes, this field will not reproduce the value on a form
    submit by default. To have the value filled in, set `hide_value` to
    `False`.
    """
    input_type = 'password'

    def __init__(self, hide_value=True):
        self.hide_value = hide_value

    def __call__(self, field, **kwargs):
        if self.hide_value:
            kwargs['value'] = ''
        return super(

我相信有一种更简单的方法可以访问密码字段的数据,而无需使用
hide\u value
。在您看来,只需将请求数据作为参数添加到表单的构造函数中:

from flask import request    

capform = RECAPTCHA_Form(request.form) 
capform.username.data = username
capform.password.data = password

这将使密码输入可用于验证,并在需要时用于测试。

更新:查看WTForms文档后,我找到了更好的解决方案


正如tomita tomita yuji所指出的,
PasswordInput
类()有一个
hide\u值
参数,但是
PasswordField
()的构造函数不会将其转发给
PasswordInput
。下面是一个
PasswordField
类,它使用
hide\u value=False
初始化
PasswordInput

from wtforms import widgets
from wtforms.fields.core import StringField


class PasswordField(StringField):
    """
    Original source: https://github.com/wtforms/wtforms/blob/2.0.2/wtforms/fields/simple.py#L35-L42

    A StringField, except renders an ``<input type="password">``.
    Also, whatever value is accepted by this field is not rendered back
    to the browser like normal fields.
    """
    widget = widgets.PasswordInput(hide_value=False)
从wtforms导入小部件
从wtforms.fields.core导入StringField
类密码字段(StringField):
"""
原始资料来源:https://github.com/wtforms/wtforms/blob/2.0.2/wtforms/fields/simple.py#L35-L42
StringField,但渲染```除外。
此外,此字段接受的任何值都不会返回
与普通字段一样,将其添加到浏览器。
"""
widget=widgets.PasswordInput(hide\u value=False)

谢谢!成功了。请注意,
PasswordInput
小部件通过
widget
关键字参数传递给
PasswordField
from wtforms import widgets
from wtforms.fields.core import StringField


class PasswordField(StringField):
    """
    Original source: https://github.com/wtforms/wtforms/blob/2.0.2/wtforms/fields/simple.py#L35-L42

    A StringField, except renders an ``<input type="password">``.
    Also, whatever value is accepted by this field is not rendered back
    to the browser like normal fields.
    """
    widget = widgets.PasswordInput(hide_value=False)