简单示例基本使用渲染校验自定义Form组件信号
简单示例
from flask
import Blueprint,render_template,request,session,redirect
from ..utils.sql
import SQLHelper
account = Blueprint(
'account',__name__)
from wtforms
import Form
from wtforms.fields
import simple,core,html5
from wtforms
import validators
from wtforms
import widgets
class Myvalidators(object):
'''自定义验证规则'''
def __init__(self,message):
self.message = message
def __call__(self, form, field):
print(field.data,
"用户输入的信息")
if field.data ==
"safly":
return None
raise validators.ValidationError(self.message)
class LoginForm(Form):
user = simple.StringField(
validators=[
Myvalidators(message=
"用户名必须是safly"),
validators.DataRequired(message=
'用户名不能为空.'),
],
widget=widgets.TextInput(),
render_kw={
'class':
'form-control'}
)
pwd = simple.PasswordField(
validators=[
validators.DataRequired(message=
'密码不能为空.'),
],
widget=widgets.PasswordInput(),
render_kw={
'class':
'form-control'}
)
@account.route('/login',methods=['GET',"POST"])
def login():
if request.method ==
'GET':
form = LoginForm()
return render_template(
'login.html',form=form)
form = LoginForm(formdata=request.form)
print(
"request.form", request.form,
"------", form.data)
if not form.validate():
return render_template(
'login.html', form=form)
obj = SQLHelper.fetch_one(
"select id,user from user where user =%(user)s and pwd=%(pwd)s", form.data)
if obj:
session.permanent =
True
session[
'user_info'] = {
'id':obj[
'id'],
'user':obj[
'user']}
return redirect(
'/index')
else:
return render_template(
'login.html',msg=
'用户名或密码错误',form=form)
基本使用
通过pip install wtforms进行安装
class RegisterForm(Form):
name = simple.StringField(
label=
'用户名',
validators=[
validators.DataRequired()
],
widget=widgets.TextInput(),
render_kw={
'class':
'form-control'},
default=
'alex'
)
pwd = simple.PasswordField(
label=
'密码',
validators=[
validators.DataRequired(message=
'密码不能为空.')
],
widget=widgets.PasswordInput(),
render_kw={
'class':
'form-control'}
)
pwd_confirm = simple.PasswordField(
label=
'重复密码',
validators=[
validators.DataRequired(message=
'重复密码不能为空.'),
validators.EqualTo(
'pwd', message=
"两次密码输入不一致")
],
widget=widgets.PasswordInput(),
render_kw={
'class':
'form-control'}
)
email = html5.EmailField(
label=
'邮箱',
validators=[
validators.DataRequired(message=
'邮箱不能为空.'),
validators.Email(message=
'邮箱格式错误')
],
widget=widgets.TextInput(input_type=
'email'),
render_kw={
'class':
'form-control'}
)
gender = core.RadioField(
label=
'性别',
choices=(
(
1,
'男'),
(
2,
'女'),
),
coerce=int
)
city = core.SelectField(
label=
'城市',
choices=SQLHelper.fetch_all(
'select id,user from user ',{},
None),
coerce=int
)
hobby = core.SelectMultipleField(
label=
'爱好',
choices=(
(
1,
'篮球'),
(
2,
'足球'),
),
coerce=int
)
favor = core.SelectMultipleField(
label=
'喜好',
choices=(
(
1,
'篮球'),
(
2,
'足球'),
),
widget=widgets.ListWidget(prefix_label=
False),
option_widget=widgets.CheckboxInput(),
coerce=int,
default=[
1,
2]
)
def __init__(self, *args, **kwargs):
super(RegisterForm, self).__init__(*args, **kwargs)
self.city.choices = SQLHelper.fetch_all(
'select id,user from user ',{},
None)
def validate_name(self, field):
"""
自定义pwd_confirm字段规则,例:与pwd字段是否一致
:param field:
:return:
"""
print(field.data)
obj = SQLHelper.fetch_one(
'select id from user where user =%s',[field.data,])
if obj:
raise validators.ValidationError(
"用户名已经存在")
渲染
<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Title</title>
</head>
<body>
<form method="post">
{% for item in form %}
<p>{{item.label}}: {{item}} {{item.errors[0] }}</p>
{% endfor %}
<input type="submit" value="提交">
</form>
</body>
</html>
校验
@account.route('/register',methods=['GET','POST'])
def register():
if request.method ==
'GET':
form = RegisterForm()
return render_template(
'register.html',form=form)
form = RegisterForm(formdata=request.form)
if form.validate():
print(
"form.data",form.data)
else:
print(
"form.errors",form.errors)
return render_template(
'register.html', form=form)
from flask
import Flask,render_template,request,Markup
app = Flask(__name__,template_folder=
"templates")
app.debug =
True
class Widget(object):
pass
class InputText(Widget):
def __call__(self, *args, **kwargs):
return "<input type='text' name='name'>"
class TextArea(Widget):
def __call__(self, *args, **kwargs):
return Markup(
"<textarea name='email'></textarea>")
class BaseForm(object):
def __init__(self):
_fields = {}
for name, field
in self.__class__.__dict__.items():
if isinstance(field, Field):
_fields[name] = field
self._fields = _fields
self.data = {}
def validate(self,request_data):
flag =
True
for name, field
in self._fields.items():
input_val = request_data.get(name,
"")
result= field.validate(input_val)
print(
"???????????",input_val,result)
if not result:
flag =
False
else:
self.data[name] = input_val
return flag
class Field(object):
'''所有类的基类'''
def __str__(self):
return Markup(self.widget())
class StringField(Field):
widget = InputText()
def validate(self,val):
if val:
return True
class EmaliField(Field):
widget = TextArea()
reg =
".*@.*"
def validate(self,val):
import re
print(re.match(self.reg,val),
"************")
if re.match(self.reg,val):
return True
class LoginForm(BaseForm):
name = StringField()
email = EmaliField()
@app.route('/index', methods=["GET","POST"])
def index():
form = LoginForm()
ret = form.validate(request.form)
print(
"验证成功",ret)
print(
"验证成功的值",form.data)
return render_template(
"index.html",form=form)
if __name__ ==
'__main__':
app.run()
模板
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form method="post">
{{form.email}}
{{form.name}}
<input type="submit" value="提交">{{msg}}
</form>
</body>
</html>
信号
from flask
import Flask, flash
from flask.signals
import _signals
app = Flask(__name__)
xinhao = _signals.signal(
"xinhao")
def func1(*args, **kwargs):
print(
"func1", args, kwargs)
def func2(*args, **kwargs):
print(
"func2", args, kwargs)
xinhao.connect(func1)
xinhao.connect(func2)
@app.route("/zzz")
def zzz():
xinhao.send(sender=
'xxx', a1=
123, a2=
456)
return "发送信号成功"
if __name__ ==
'__main__':
app.run(debug=
True)