Flask-WTF 示例
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField
from wtforms.validators import DataRequired, Length, Email, EqualTo
class UserRegisterForm(FlaskForm):
username = StringField('用戶名', [DataRequired('用戶名必填!'), Length(min=6, max=20, message='用戶名必須介於6-20字符!')])
password = PasswordField('密碼', [DataRequired('密碼必填!'), Length(min=6, max=20, message='密碼必須介於6-20字符!')])
confirm = PasswordField('重複密碼', [DataRequired('重複密碼必填!'), EqualTo('password', message='兩次密碼輸入不一致!')])
email = StringField('郵箱', [DataRequired('郵箱必填!'), Email('郵箱格式不正確!')])
view.py
class RegView(MethodView):
def get(self):
form = UserRegisterForm(request.form)
return render_template('register.html', form=form)
def post(self):
form = UserRegisterForm(request.form)
if User.query.filter_by(username=form.username.data).first():
flash("當前用戶名已經註冊!")
return render_template('register.html', form=form)
elif User.query.filter_by(email=form.email.data).first():
flash("當前郵箱已經註冊!")
return render_template('register.html', form=form)
else:
form.validate_on_submit()
user = User(
form.username.data,
form.password.data,
form.email.data,
)
user.save()
return redirect(url_for('.login'))
{% macro renden_field(field) %}
{% if field.errors %}
{% for error in field.errors %}
<li style="font-size: medium">{{ error }}</li>
{% endfor %}
{% endif %}
{% endmacro %}
{% macro messages(get_flashed_messages) %}
{% with messages = get_flashed_messages() %}
{% if messages %}
{% for message in messages %}
<div class="alert alert-danger">
<a href="#" class="close" data-dismiss="alert">×</a>
{{ message }}
</div>
{% endfor %}
{% endif %}
{% endwith %}
{% endmacro %}
form.html
{% from 'helper.html' import renden_field,messages %}
<form action="" class="form-horizontal" method="post">
{{ form.csrf_token }}
{{ messages(get_flashed_messages) }}
<div class="panel-body">
<div class="form-group">
{{ form.username.label(class="col-lg-2 col-sm-2 control-label") }}
<div class="col-md-6">
{{ form.username(class='from-control') }}
{{ renden_field(form.username) }}
</div>
</div>
<div class="form-group">
{{ form.password.label(class="col-lg-2 col-sm-2 control-label") }}
<div class="col-md-6">
{{ form.password(class='from-control') }}
{{ renden_field(form.password) }}
</div>
</div>