Jun-12-2024, 06:53 PM
(This post was last modified: Jun-12-2024, 06:53 PM by robertkwild.)
ok so got it working, may add more custom validators
from flask import Flask, render_template, request from flask_wtf import FlaskForm from wtforms import StringField, PasswordField, BooleanField, DecimalField, RadioField, SelectField, TextAreaField, FileField, SubmitField from wtforms.validators import InputRequired, Length, DataRequired, EqualTo, Regexp, ValidationError import re app = Flask(__name__) app.config['SECRET_KEY'] = 'secretkey' class PasswordForm(FlaskForm): un = StringField('Username', [InputRequired(message='please enter your Username')]) op = PasswordField('Current Password', [InputRequired(message='please enter your current password')]) np = PasswordField('New Password', [InputRequired(message='please enter your new password')]) cnp = PasswordField('Confirm New Password') dom = SelectField('Domain', choices=[('lon-prod-dc01.domain.com', 'prod'), ('lon-corp-dc01.domain.com', 'corp')]) def validate_np(form, field): if form.un.data: if field.data in form.un.data.split("."): raise ValidationError('New password cant contain firstname or lastname') if field.data == form.op.data: raise ValidationError('New password cant match Current password') if len(field.data) < 12: raise ValidationError('New password must be at least 12 characters') if not re.search(r"[0-9]", field.data): raise ValidationError('New password has to contain one number') if not re.search(r"[a-z]", field.data): raise ValidationError('New password has to contain one lower case character') if not re.search(r"[A-Z]", field.data): raise ValidationError('New password has to contain one upper case character') if not re.search(r"[\`\¬\!\"\£\$\%\^\&\*\(\)\-\_\=\+\\\|\[\]\;\'\#\,\.\/\{\}\:\@\~\<\>\?]", field.data): raise ValidationError('New password has to contain one special character') if not field.data == form.cnp.data: raise ValidationError('New password has to match Confirm new password') @app.route('/password', methods=['GET', 'POST']) def password(): form = PasswordForm() if request.method == 'POST' and form.validate(): return '<h1>The username is {}. The old password is {}. the new password is {}. changing for domain {}'.format(form.un.data, form.op.data, form.cnp.data, form.dom.data) return render_template('password.html', form=form) if __name__ == '__main__': app.run(debug=True)and front end
{% block content %} <h1>Change Password</h1> <form method="post" novalidate> {{form.hidden_tag()}} <p>{{ form.un.label }}</p> <p>{{ form.un}}</p> {% if form.un.errors %} <ul> {% for error in form.un.errors %} <li> {{error}} </li> {% endfor %} </ul> {% endif %} <p>{{ form.op.label }}</p> <p>{{ form.op}}</p> {% if form.op.errors %} <ul> {% for error in form.op.errors %} <li> {{error}} </li> {% endfor %} </ul> {% endif %} <p>{{ form.np.label }}</p> <p>{{ form.np}}</p> {% if form.np.errors %} <ul> {% for error in form.np.errors %} <li> {{error}} </li> {% endfor %} </ul> {% endif %} <p>{{ form.cnp.label }}</p> <p>{{ form.cnp}}</p> {% if form.cnp.errors %} <ul> {% for error in form.cnp.errors %} <li> {{error}} </li> {% endfor %} </ul> {% endif %} <p>{{ form.dom.label }}</p> <p>{{ form.dom}}</p> <input type="submit" value="Submit"> </form> {%endblock%}but my problem now is it doesnt show all the errors same time on the front end for the user, only shows one error at a time when you hit submit