字段对象 |
说明 |
---|---|
StringField |
文本字段 |
TextAreaField |
多行文本字段 |
PasswordField |
密码文本字段 |
HiddenField |
隐藏文本字段 |
DateField |
文本字段,值为datetime.date格式 |
DateTimeField |
文本字段,值为datetime.datetime格式 |
IntegerField |
文本字段,值为整数 |
DecimalField |
文本字段,值为decimal.Decimal |
FloatField |
文本字段,值为浮点数 |
BooleanField |
复选框,值为True和False |
RadioField |
一组单选框 |
SelectField |
下拉列表 |
SelectMultipleField |
下拉列表,可选择多个值 |
FileField |
文本上传字段 |
SubmitField |
表单提交按钮 |
FormField |
把表单做为字段嵌入另外一个表单 |
FieldList |
一组指定类型的字段 |
验证函数 |
说明 |
---|---|
DataRequired |
确保字段中有数据 |
EqualTo |
比较两个字段的值,经常使用于比较两次密码输入 |
Length |
验证输入的字符串长度 |
NumberRange |
验证输入的值在数字范围内 |
URL |
验证URL |
AnyOf |
验证输入值在可选列表中 |
NoneOf |
验证输入值不在可选列表中 |
注意:使用Flask-WTF须要配置参数SECRET_KEY。CSRF_ENABLED是为了CSRF(跨站请求伪造)保护。 SECRET_KEY用来生成加密令牌,当CSRF激活的时候,该设置会根据设置的密匙生成加密令牌。html
使用流程:首先定义一个表单的类,继承自FlaskForm在这个类,在类中建立字段,分别导入须要的字段的类[好比用户名导入StringField,密码导入PasswordField...根据本身的需求导入就好],准备就基本完成,接下来定义一个视图,在视图中建立表单对象,也就是你刚才建立的类对象,完成后返回你指定的模板文件,和表单对象便可,这里咱们建立的表单对象为form
1 # coding:utf-8 2 from flask import Flask, render_template, redirect, url_for, session 3 from flask_wtf import FlaskForm 4 from wtforms import StringField, PasswordField, SubmitField 5 from wtforms.validators import DataRequired, EqualTo 6 7 import sys 8 reload(sys) 9 sys.setdefaultencoding('utf8') 10 11 app = Flask(__name__) 12 app.config['SECRET_KEY'] = 'asd' 13 14 15 # 定义登录表单 16 class RegisterForm(FlaskForm): 17 # 建立须要提交的字段 18 # validators 是验证器 Datarequired 是不能为空 EqualTo是和谁相等 19 username = StringField(label=u"用户名", validators=[DataRequired(u'用户名不能为空')]) 20 password = PasswordField(label=u'密码', validators=[DataRequired(u'密码不能为空')]) 21 password2 = PasswordField(label=u'确认密码', validators=[DataRequired(u'确认密码不能为空'), EqualTo('password', u'两次密码不一致')]) 22 23 submit = SubmitField(label='提交') 24 25 26 @app.route('/register', methods=['post', 'get']) 27 def register(): 28 # 建立表单对象, 若是是post请求,前端发送了数据,flask会把数据在构造form对象的时候,存放到对象中,因此不用验证是get请求,仍是post请求 29 form = RegisterForm() 30 31 # 判断form中的数据是否合法 32 # 若是form中的数据彻底知足全部的验证器,则返回真,不然返回假 33 if form.validate_on_submit(): 34 # 表示前端发送的数据合法 35 # 获取前端发送的数据 36 uname = form.username.data 37 pw = form.password.data 38 pw2 = form.password2.data 39 print(uname, pw, pw2) 40 # 添加到session中 41 session['username'] = uname 42 # 跳转到index页面 43 return redirect(url_for("index")) 44 return render_template('register.html', form=form) 45 46 47 @app.route('/index') 48 def index(): 49 # 将登录时候设置的session取出 50 username = session.get('username') 51 return "%s" % username 52 53 54 if __name__ == '__main__': 55 app.run(debug=True)
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 </head> 7 <body> 8 <form method="post"> 9 {{ form.csrf_token }} 10 11 {{ form.username.label }} 12 <p>{{ form.username }}</p> 13 <div> 14 {% for msg in form.username.errors %} 15 <p>{{ msg }}</p> 16 {% endfor %} 17 </div> 18 {{ form.password.label }} 19 <p>{{ form.password }}</p> 20 {% for msg in form.password.errors %} 21 <p>{{ msg }}</p> 22 {% endfor %} 23 24 {{ form.password2.label }} 25 <p>{{ form.password2 }}</p> 26 {% for msg in form.password2.errors %} 27 <p>{{ msg }}</p> 28 {% endfor %} 29 30 {{ form.submit }} 31 </form> 32 </body> 33 </html>
注意:这里必定要记得设置 SECRET_KEY, 后面的值本身定义或者使用Python生成均可以,也须要在HTML页面中,设置csrf_token前端
{#不带参数宏的定义#} {% macro input() %} <input type="text" name="username" value="" size="30"/> {% endmacro %} {#使用#} {{ input() }}
{# 带参数宏的定义 #} {% macro input(name,value='',type='text',size=20) %} <input type="{{ type }}" name="{{ name }}" value="{{ value }}" size="{{ size }}"/> {% endmacro %} {#使用#} {{ input(value='name',type='password',size=40)}}
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>title</title> </head> <body> {# 不带参数 #} {% macro input() %} <input type="text" value="" size="30"> {% endmacro %} <h1>input 1</h1> {{ input() }} <h1>input 2</h1> {{ input() }} {# 带参数 #} {% macro input2(type, value, size) %} <input type="{{ type }}" value="{{ value }}" size="{{ size }}"> {% endmacro %} <h1>input2 1</h1> {{ input2("password", "", 50) }} <h1>input2 2</h1> {{ input2("password", "", 10) }} </body> </html>
# coding:utf-8 from flask import Flask, render_template app = Flask(__name__) @app.route("/index") def index(): return render_template("index.html") if __name__ == '__main__': app.run(host='0.0.0.0', debug=True)
{# 带默认参数 #} {% macro input3(type="text", value="", size="30") %} <input type="{{ type }}" value="{{ value }}" size="{{ size }}"> {% endmacro %} <h1>input3 1</h1> {{ input3() }} <h1>input3 2</h1> {{ input3(type='password') }}
{% macro input4(type="text", value="", size="44") %} <input type="{{ type }}" value="{{ value }}" size="{{ size }}"> {% endmacro %}
在模板index.html 中使用python
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>title</title> </head> <body> ... {# 导入宏 #} {% import "macro_input.html" as input_func %} <h1>input4 1</h1> {{ input_func.input4() }} </body> </html>
{% block top %}``{% endblock %}
标签订义的内容,至关于在父模板中挖个坑,当子模板继承父模板时,能够进行填充。 {% block top %}
顶部菜单
{% endblock top %}
{% block content %}
{% endblock content %}
{% block bottom %}
底部
{% endblock bottom %}
{% extends 'base.html' %}
{% block content %}
须要填充的内容
{% endblock content %}
{\% include 'hello.html' %}
include的使用加上关键字ignore missing
{\% include 'hello.html' ignore missing %}
{# config 对象就是Flask的config对象,也就是 app.config 对象。#}
{{ config.SQLALCHEMY_DATABASE_URI }}
属性 | 说明 | 类型 |
---|---|---|
data | 记录请求的数据,并转换为字符串 | * |
form | 记录请求中的表单数据 | MultiDict |
args | 记录请求中的查询参数 | MultiDict |
cookies | 记录请求中的cookie信息 | Dict |
headers | 记录请求中的报文头 | EnvironHeaders |
method | 记录请求使用的HTTP方法 | GET/POST |
url | 记录请求的URL地址 | string |
files | 记录请求上传的文件 | * |
使用
{{ request.url }}
web
{{ url_for('index') }}
{{ url_for('post', post_id=1024) }}
{% for message in get_flashed_messages() %}
{{ message }}
{% endfor %}