#python #flask #flask-wtforms
#python #flask #flask-wtforms
Вопрос:
Моя форма входа в систему очень похожа на эту, и она работает как шарм. Я просто не понимаю, почему form.validate_on_submit()
выдает False. Как вы можете видеть, я использую print(form.errors)
, чтобы посмотреть, что там происходит, но все, что я получаю, это пустой словарь, который не очень полезен.
У меня возникла проблема с этой регистрационной формой:
@users.route('/register', methods=['GET', 'POST'])
def register():
if request.method == 'POST':
form = RegisterView(request.form)
if form.validate_on_submit():
user = User(
first_name=form.first_name.data.title(),
last_name=form.last_name.data.title(),
email=form.email.data,
mobile_number=form.mobile_number.data,
city=form.city.data.title(),
country=form.country.data,
password=User.set_password(form.password.data),
)
db.session.add(user)
db.session.commit()
flash('Your account has been created. You can now log in.', 'success')
return redirect(url_for('users.login'))
else:
print(form.errors)
else:
form = RegisterView()
return render_template('users/register.html', title='Register User',
form=form)
и это html:
<div class='container'>
<form action='' method='post'>
{{ form.hidden_tag() }}
<legend>Register User</legend>
<fieldset class='form-group'>
<div class='form-group'>
{{ form.first_name(class='form-control', placeholder='First Name') }}
{{ form.last_name(class='form-control', placeholder='Last Name') }}
{{ form.email(class='form-control', placeholder='@') }}
{{ form.mobile_number(class='form-control', placeholder='Mobile Number') }}
{{ form.city(class='form-control', placeholder='City') }}
{{ form.country(class='form-control') }}
{{ form.password(class='form-control', placeholder='Password') }}
{{ form.conf_password(class='form-control', placeholder='Confirm Password') }}
</div>
</fieldset>
<div class='form-group'>
{{ form.submit(class='btn btn-primary') }}amp;nbsp;
<a href='{{ url_for("main.register") }}' id='btn' class='btn btn-warning'>Back</a>
</div>
</form>
Подробнее:
class Configuration:
APPLICATION_DIR = os.path.dirname(os.path.realpath(__file__))
SQLALCHEMY_TRACK_MODIFICATIONS = False
SECRET_KEY = os.environ.get('SECRET_KEY') or 'xyz'
MAIL_SUBJECT_PREFIX = 'xyz'
MAIL_SENDER = 'vtc@gmail.com' # change this to use ProtonMail instead
@staticmethod
def init_app(app):
pass
class DevelopmentConfig(Configuration):
DEBUG = True
SQLALCHEMY_DATABASE_URI = 'xyz'
Комментарии:
1. является ли ваша
hidden_tag()
защита CSRF? в противном случае, если вы пропускаете это в своей форме и не игнорируете это, явно установивdebug
mode, произойдет сбой2. @Attack68 Я добавил свой config.py файл, который вы можете увидеть. Я считаю, что атрибут debug не будет тем, что вызывает проблему здесь.
3. Я думаю, вам это может понадобиться
WTF_CSRF_ENABLED = False
, смотрите здесь flask-wtf.readthedocs.io/en/stable/config.html
Ответ №1:
Несколько моментов, которые следует иметь в виду:
- это регистрационная форма, так зачем нужна строка
form = RegisterView(request.form)
? validate_on_submit
несколько соответствует,request.method == 'POST' and form.validate()
поэтому наличиеvalidate_on_submit
внутриrequest.method == 'POST'
не имеет слишком большого смысла- Не уверен, что это уместно, но у вас есть запятая в конце строки
password=User.set_password(form.password.data),
- Я предполагаю,
validate_on_submit
что это false из-за токена csfr (тайм-аут / отсутствует), в stackoverflow есть сообщения об этом, хотя я не рекомендую помещатьWTF_CSRF_ENABLED = False
и забывать об этом
Вот как я бы это закодировал:
@users.route('/register', methods=['GET', 'POST'])
def register():
form = RegisterView()
if form.validate_on_submit():
user = User(
first_name=form.first_name.data.title(),
last_name=form.last_name.data.title(),
email=form.email.data,
mobile_number=form.mobile_number.data,
city=form.city.data.title(),
country=form.country.data,
password=User.set_password(form.password.data))
db.session.add(user)
db.session.commit()
flash('Your account has been created. You can now log in.', 'success')
return redirect(url_for('users.login'))
return render_template('users/register.html', title='Register User',
form=form)