【问题标题】:Populate a PasswordField in wtforms在 wtforms 中填充 PasswordField
【发布时间】:2014-02-14 12:18:13
【问题描述】:

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>             

我曾尝试将PasswordField 更改为TextField,然后就可以了。

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

【问题讨论】:

    标签: flask wtforms


    【解决方案1】:

    更新:在浏览了 WTForms 文档后,我发现了一个更好的解决方案。 There is a widget arg.

    from wtforms import StringField
    from wtforms.widgets import PasswordInput
    
    class MyForm(Form):
         # ...
    
         password = StringField('Password', widget=PasswordInput(hide_value=False))
    

    正如 yuji-tomita-tomita 所指出的,PasswordInput 类 (source) 有一个 hide_value 参数,但是 PasswordField (source) 的构造函数不会将其转发给 PasswordInput .这是一个PasswordField 类,它用hide_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)
    

    【讨论】:

      【解决方案2】:

      我在 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(
      

      【讨论】:

      • 谢谢!有效。作为其他人的注释,PasswordInput 小部件通过 widget 关键字参数传递给 PasswordField
      【解决方案3】:

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

      from flask import request    
      
      capform = RECAPTCHA_Form(request.form) 
      capform.username.data = username
      capform.password.data = password
      

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

      【讨论】:

        猜你喜欢
        • 2013-11-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-27
        • 1970-01-01
        • 2017-09-18
        • 2017-10-25
        相关资源
        最近更新 更多