Заполнить поле пароля в wtforms


Можно ли заполнить поле пароля в 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?

3 4

3 ответа:

Что-то я нашел в 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(

Я считаю, что есть более простой способ получить доступ к данным поля пароля, не используя hide_value. На ваш взгляд, просто добавьте данные запроса в качестве аргумента конструктора формы:

from flask import request    

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

Это должно сделать ввод пароля доступным для проверки и, при желании, для использования в тестировании.

Update: после просмотра документов WTForms я нашел еще лучшее решение. есть виджет arg .

from wtforms import StringField
from wtforms.widgets import PasswordInput

class MyForm(Form):
     # ...

     password = StringField('Password', widget=PasswordInput(hide_value=False))

Как указал Юджи-Томита-Томита, класс PasswordInput (Источник ) имеет Аргумент hide_value, однако конструктор PasswordField (Источник ) не передает его в PasswordInput. Вот класс PasswordField, который инициализирует PasswordInput с помощью hide_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)