字段對象 |
說明 |
---|---|
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 %}