Заполнить поле пароля в 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 ответа:
Что-то я нашел в 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)