1、過濾器html
safe:禁用轉義;前端
<p>{{ '<em>hello</em>' | safe }}</p>flask
capitalize:把變量值的首字母轉成大寫,其他字母轉小寫;api
<p>{{ 'hello' | capitalize }}</p>session
lower:把值轉成小寫;app
<p>{{ 'HELLO' | lower }}</p>函數
upper:把值轉成大寫;post
<p>{{ 'hello' | upper }}</p>ui
title:把值中的每一個單詞的首字母都轉成大寫;url
<p>{{ 'hello' | title }}</p>
trim:把值的首尾空格去掉;
<p>{{ ' hello world ' | trim }}</p>
reverse:字符串反轉;
<p>{{ 'olleh' | reverse }}</p>
format:格式化輸出;
<p>{{ '%s is %d' | format('name',17) }}</p>
striptags:渲染以前把值中全部的HTML標籤都刪掉;
<p>{{ '<em>hello</em>' | striptags }}</p>
first:取第一個元素
<p>{{ [1,2,3,4,5,6] | first }}</p>
last:取最後一個元素
<p>{{ [1,2,3,4,5,6] | last }}</p>
length:獲取列表長度
<p>{{ [1,2,3,4,5,6] | length }}</p>
sum:列表求和
<p>{{ [1,2,3,4,5,6] | sum }}</p>
sort:列表排序
<p>{{ [6,2,3,1,5,4] | sort }}</p>
2、自定義過濾器
一、定義函數方式
@app.route("/") def index(): data = [1,2,3,4,5] return render_template("index.html", data=data) # 一、定義過濾器 def list(li): # 1,3,5 return li[::2] # 二、註冊過濾器 # to_list是模板中使用的名字 app.add_template_filter(list, "to_list")
二、使用裝飾器方式
@app.template_filter("to_list") def list(li): # 1,3,5 return li[::2]
使用:{{data | to_list}}
3、Flask-WTF表單擴展
WTForms支持的HTML標準字段
字段對象 | 說明 |
---|---|
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 | 一組指定類型的字段 |
WTForms經常使用驗證函數
驗證函數 | 說明 |
---|---|
DataRequired | 確保字段中有數據 |
EqualTo | 比較兩個字段的值,經常使用於比較兩次密碼輸入 |
Length | 驗證輸入的字符串長度 |
NumberRange | 驗證輸入的值在數字範圍內 |
URL | 驗證URL |
AnyOf | 驗證輸入值在可選列表中 |
NoneOf | 驗證輸入值不在可選列表中 |
pip install flask-wtf
from flask import Flask, redirect, request, url_for, render_template, session from flask_wtf import FlaskForm from wtforms import StringField, PasswordField, SubmitField from wtforms.validators import DataRequired, EqualTo # 建立flask應用對象 # __name__ 表明當前模塊名稱 # flask以當前目錄爲總目錄,static目錄爲靜態目錄,templates爲模版目錄 app = Flask(__name__) app.config["SECRET_KEY"] = "yang" # 定義表單模型類 class RegisterForm(FlaskForm): # DataRequired 設置數據必填 username = StringField(label=u"用戶名:", validators=[DataRequired(u"請輸入用戶名")]) password = PasswordField(label=u"密碼", validators=[DataRequired("請輸入密碼")]) password2 = PasswordField(label="確認密碼", validators=[DataRequired("請輸入祕密"), EqualTo("password", "兩次密碼不一致")]) submit = SubmitField(label=u"註冊") @app.route("/") def index(): user_info = session.get("user_info") return str(user_info) @app.route("/register", methods=["POST", "GET"]) def register(): # 若是是post,會把前端返回的數據放到form中 form = RegisterForm() # 驗證表單數據是否合格 if form.validate_on_submit(): # 驗證合格, 提取數據 username = form.username.data password = form.password.data print("username: %s, password=%s" % (username, password)) session["user_info"] = {"username": username, "password": password} return redirect(url_for("index")) return render_template("register.html", form = form) if __name__ == '__main__': # 啓動應用程序 app.run(port=8083,debug=True)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="" method="post"> {{form.csrf_token}} {{form.username.label}} <p>{{form.username}}</p> {% for msg in form.username.errors %} <p>{{msg}}</p> {% endfor %} {{form.password.label}} <p>{{form.password}}</p> {% for msg in form.password.errors %} <p>{{msg}}</p> {% endfor %} {{form.password2.label}} <p>{{form.password2}}</p> {% for msg in form.password2.errors %} <p>{{msg}}</p> {% endfor %} {{form.submit}} </form> </body> </html>
4、宏
將重複的代碼定義成宏。
一、不帶參數定義宏
{% 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)}}
三、把宏單獨抽取出來,封裝成html文件,其它模板中導入使用
文件名能夠自定義macro.html
{% macro function() %} <input type="text" name="username" placeholde="Username"> <input type="password" name="password" placeholde="Password"> <input type="submit"> {% endmacro %}
在其它模板文件中先導入,再調用
{% import 'macro.html' as func %}
{% func.function() %}
5、模版的繼承與包含
extends 與 include