一、原生表单
form.html
1
2
3
4
5
6
7
8
9
10
11
12
|
{% extends 'common/base.html' %}
{% block title %}
原生表单
{% endblock %}
{% block pagecontent %}
{# < form action = "{{ url_for('check') }}" method = "post" >#}
< form action = "{{ url_for('form') }}" method = "post" >
< p >用户名: < input type = "text" name = "username" placeholder = "请输入用户名" maxlength = "12" ></ p >
< p >密码: < input type = "password" name = "userpass" placeholder = "请输入密码..." ></ p >
< p >< input type = "submit" value = "提交" ></ p >
</ form >
{% endblock %}
|
manage.py
1
2
3
4
5
6
7
8
9
|
@app .route( '/form/' )
def form():
return render_template( 'form1.html' )
#接收表单的数据
@app .route( '/check/' ,methods = [ 'POST' ])
def check():
print (request.form)
return '提交过来了'
|
将俩个路由地址合并为同一个
1
2
3
4
5
|
@app .route( '/form/' ,methods = [ 'GET' , 'POST' ])
def form():
if request.method = = 'POST' :
print (request.form)
return render_template( 'form1.html' )
|
二、使用flask-wtf表单扩展库
作用: 是一个用于表单处理的扩展库 提供表单的校验 csrf的功能
1
|
pip install flask - wtf
|
使用
(1) 字段类型
字段名称 | 字段类型 |
---|---|
StringField | 普通文本字段 |
PasswordField | 密码框 |
SubmitField | 提交按钮 |
TextAreaField | 多行文本域 |
HiddenField | 隐藏域 |
DateField | 日期 |
DateTimeField | 日期时间 |
IntegerField | 整形 |
FloatFIeld | 浮点型 |
RadioField | 单选字段 |
SelectField | 下拉 |
FileField | 文件上传字段 |
BooleanField | 布尔字段 |
(2) 验证器
验证器 | 说明 |
---|---|
DataRequired | 必填 |
Length | 长度 min max |
IPAddress | IP地址 |
邮箱 | |
URL | 地址 |
Regexp | 正则匹配 |
EqualTo | 验证俩个字段值的正确性 |
NumberRange | 输入值的范围 min max |
实例
在manage中
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
from flask import Flask,render_template,request
from flask_script import Manager
from flask_bootstrap import Bootstrap
#导入自定义表单类的基类
from flask_wtf import FlaskForm
#导入表单的字段
from wtforms import StringField,PasswordField,SubmitField
#导入验证器
from wtforms.validators import Length,DataRequired
app = Flask(__name__)
bootstrap = Bootstrap(app)
#加密种子 csrf需要使用
app.config[ 'SECRET_KEY' ] = 'abcdedff'
manager = Manager(app)
class Login(FlaskForm):
username = StringField( '用户名' ,validators = [Length( min = 6 , max = 12 ,message = '用户名的长度为6~12为' ),DataRequired(message = '用户名不能为空!!!' )])
userpass = PasswordField( '密码' ,validators = [Length( min = 6 , max = 12 ,message = '用户名的长度为6~12为' ),DataRequired(message = '密码不能为空!!!' )])
submit = SubmitField( '登录' )
@app .route( '/' )
def index():
return render_template( 'index.html' )
@app .route( '/form/' ,methods = [ 'GET' , 'POST' ])
def form():
#将表单类实例化
form = Login()
if request.method = = 'POST' :
#验证是否存在正确的csrftoken和 数据的正确性 如果都正确则为真
if form.validate_on_submit():
# print(request.form)
print (form.username.data)
return render_template( 'form2.html' ,form = form)
from flask import Flask,render_template,request
from flask_script import Manager
from flask_bootstrap import Bootstrap
#导入自定义表单类的基类
from flask_wtf import FlaskForm
#导入表单的字段
from wtforms import StringField,PasswordField,SubmitField
#导入验证器
from wtforms.validators import Length,DataRequired
app = Flask(__name__)
bootstrap = Bootstrap(app)
#加密种子 csrf需要使用
app.config[ 'SECRET_KEY' ] = 'abcdedff'
manager = Manager(app)
class Login(FlaskForm):
username = StringField( '用户名' ,validators = [Length( min = 6 , max = 12 ,message = '用户名的长度为6~12为' ),DataRequired(message = '用户名不能为空!!!' )])
userpass = PasswordField( '密码' ,validators = [Length( min = 6 , max = 12 ,message = '用户名的长度为6~12为' ),DataRequired(message = '密码不能为空!!!' )])
submit = SubmitField( '登录' )
@app .route( '/' )
def index():
return render_template( 'index.html' )
@app .route( '/form/' ,methods = [ 'GET' , 'POST' ])
def form():
#将表单类实例化
form = Login()
if request.method = = 'POST' :
#验证是否存在正确的csrftoken和 数据的正确性 如果都正确则为真
if form.validate_on_submit():
# print(request.form)
print (form.username.data)
return render_template( 'form2.html' ,form = form)
|
在模板中
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
{ % extends 'common/base.html' % }
{ % block title % }
原生表单
{ % endblock % }
{ % block pagecontent % }
<form action = "{{ url_for('form') }}" method = "post" >
<p>{{ form.csrf_token }}< / p>
<p>{{ form.username.label() }} {{ form.username(style = 'color:red;' , class = 'userclass' ,placeholder = '请输入用户名' ) }}
{ % if form.errors % }
<span style = "color:red;" >{{ form.errors.username. 0 }}< / span>
{ % endif % }
< / p>
<p>{{ form.userpass.label() }} {{ form.userpass() }}< / p>
<p>{{ form.submit() }}< / p>
< / form>
{ % endblock % }
|
使用 bootstrap渲染表单
1
2
3
4
5
6
7
8
|
{ % import 'bootstrap/wtf.html' as wtf % }
{ % block pagecontent % }
<div class = "row" >
<div class = "col-md-8" >图片< / div>
<div class = "col-md-4" >{{ wtf.quick_form(form,action = " ",method=" ") }}
< / div>
< / div>
{ % endblock % }
|
自定义表单验证器
1
2
3
4
5
6
7
|
class Login(FlaskForm):
...
def validate_username( self ,field):
# print(field)
if field.data = = 'zhangsan' :
# if self.username.data == 'zhangsan':
raise ValidationError( '该用户已存在' )
|
注意:
validate_ 验证的字段名称 为固定格式
所有字段和验证器方法的使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
class Login(FlaskForm):
username = StringField( '用户名' ,validators = [Length( min = 6 , max = 12 ,message = '用户名的长度为6~12为' ),DataRequired(message = '用户名不能为空!!!' )])
userpass = PasswordField( '密码' ,validators = [Length( min = 6 , max = 12 ,message = '用户名的长度为6~12为' ),DataRequired(message = '密码不能为空!!!' ),EqualTo( 'confirm' ,message = '俩次密码输入不一致' )])
confirm = PasswordField( '确认密码' )
info = TextAreaField( '个人简介' ,validators = [Length( min = 6 , max = 20 ,message = '内容为6-20个长度' ),DataRequired(message = '内容不能为空' )],render_kw = { "style" : "resize:none;" , 'placeholder' : "请输入你此刻的感谢..." })
hidde = HiddenField()
birth = DateField( '出生日期' )
birth = DateTimeField( '出生日期' )
age = IntegerField( '年龄' ,validators = [NumberRange( min = 6 , max = 99 ,message = '年龄为6~99岁' )])
money = FloatField()
sex = RadioField(choices = [( 'w' , '女' ),( 'm' , '男' )])
address = SelectField(choices = [( '1001' , '北京' ),( '1002' , '上海' ),( '1003' , '天津' )])
file = FileField( '文件上传' )
argee = BooleanField( '请仔细阅读以上条款' )
ip = StringField( 'IPV4' ,validators = [IPAddress(message = '请输入正确的ip地址' )])
url = StringField( 'url地址' ,validators = [URL(message = '输入正确的url地址' )])
email = StringField( 'email' ,validators = [Email(message = '请输入正确的邮箱地址' )])
preg = StringField( '手机号码' ,validators = [Regexp( '^[1][3-8][0-9]{9}$' ,flags = re.I,message = '请输入正确的手机号码' )])
submit = SubmitField( '登录' )
|
三、flash 消息的显示
概述: 当用户请求 或者有消息的显示 通过flash,get_flashed_messages 来进行操作
导入
from flask import flash,get_flashed_messages
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
from flask import flash,get_flashed_messages
class Login(FlaskForm):
username = StringField( '用户名' ,validators = [DataRequired(message = '用户名不能为空' )])
userpass = PasswordField( '密码' ,validators = [DataRequired(message = '密码不能为空' )])
submit = SubmitField( '登录' )
@app .route( '/form/' ,methods = [ 'GET' , 'POST' ])
def form():
form = Login()
if form.validate_on_submit():
if form.username.data = = 'zhangsan' and form.userpass.data = = '123456' :
flash( '登录成功' )
return redirect(url_for( 'index' ))
else :
flash( '当前用户不存在' )
return render_template( 'user/login.html' ,form = form)
|
使用
1
2
3
|
{ % for message in get_flashed_messages() % }
<div class = "alert alert-danger" role = "alert" >{{ message }}< / div>
{ % endfor % }
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://segmentfault.com/a/1190000015228524