用wtforms填充PasswordField

J. *_*sen 5 flask wtforms

是否可以在烧瓶中的wtforms中填充密码字段?

我已经试过了:

capform = RECAPTCHA_Form() 
capform.username.data = username
capform.password.data = password
Run Code Online (Sandbox Code Playgroud)

形式定义如下:

class RECAPTCHA_Form(Form):
    username = TextField('username', validators=[DataRequired()])
    password = PasswordField('password', validators=[DataRequired()])
    remember_me = BooleanField('Remember me.')
    recaptcha = RecaptchaField()        
Run Code Online (Sandbox Code Playgroud)

模板如下所示:

<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>             
Run Code Online (Sandbox Code Playgroud)

我尝试将更PasswordField改为TextField,然后可以使用。

在wtforms中填充PasswordFields有一些特殊限制吗?

fnk*_*nkr 6

更新:在浏览 WTForms 文档后,我找到了一个更好的解决方案。有一个小部件 arg

from wtforms import StringField
from wtforms.widgets import PasswordInput

class MyForm(Form):
     # ...

     password = StringField('Password', widget=PasswordInput(hide_value=False))
Run Code Online (Sandbox Code Playgroud)

正如 yuji-tomita-tomita 所指出的,PasswordInput类(source)有一个hide_value参数,但是PasswordFieldsource)的构造函数没有将它转发到PasswordInput. 这里是一个PasswordField初始化类PasswordInputhide_value=False

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)
Run Code Online (Sandbox Code Playgroud)


Yuj*_*ita 5

我在 Flask 和 Flask 应用程序中发现的一些东西是,源是文档。实际上,默认情况下您无法填充该字段。您可以传递一个参数hide_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(
Run Code Online (Sandbox Code Playgroud)