一、过滤器

safe:禁用转义;

<p>{{ '<em>hello</em>' | safe }}</p>

capitalize:把变量值的首字母转成大写,其余字母转小写;

<p>{{ 'hello' | capitalize }}</p>

lower:把值转成小写;

<p>{{ 'HELLO' | lower }}</p>

upper:把值转成大写;

<p>{{ 'hello' | upper }}</p>

title:把值中的每个单词的首字母都转成大写;

<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>

二、自定义过滤器

  1、定义函数方式

@app.route("/")
def index():
data = [1,2,3,4,5]
return render_template("index.html", data=data) # 1、定义过滤器
def list(li):
# 1,3,5
return li[::2]
# 2、注册过滤器
# to_list是模板中使用的名字
app.add_template_filter(list, "to_list")

  2、使用装饰器方式

@app.template_filter("to_list")
def list(li):
# 1,3,5
return li[::2]

使用:{{data | to_list}}

三、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>

四、宏

将重复的代码定义成宏。

1、不带参数定义宏

{% macro input() %}
<input type="text"
name="username"
value=""
size="30"/>
{% endmacro %} {{ input() }}

2、定义带参数的宏

{% 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)}}

3、把宏单独抽取出来,封装成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() %}

五、模版的继承与包含

extends 与 include

  

最新文章

  1. Dynamics AX 2012 R2 IIS WebSite Unauthorized 401
  2. 黄聪:PHP解决textarea内容换行存入数据库,如何解析取出不能自动换行
  3. 阿里云配置nginx+php+mysql
  4. java web中日期Date类型在页面中格式化显示的三种方式
  5. HTML部分标签和代码
  6. 06socket编程
  7. 学习jax-ws(一)
  8. VMware网络配置 实现与物理机互访
  9. C语言中宏定义(#define)时do{}while(0)的价值(转)
  10. Python 100例(上)
  11. spring cloud 入门系列五:使用Feign 实现声明式服务调用
  12. python-web自动化-鼠标操作
  13. JDBC 初始。
  14. 一个简单SpringBoot例子
  15. 37.Spring-事务控制.md
  16. pycharm git无法使用问题(待解决)
  17. 「PKUSC2018」主斗地(暴搜)
  18. Android处理ListView中的Item中的Button按钮不能点击的问题
  19. native2ascii -reverse -encoding UTF-8 validation_msg.properties &gt; validation_msg_src.properties
  20. wamp设置自定义域名访问php网站

热门文章

  1. 超线程技术——超线程技术让(P4)处理器增加5%的裸晶面积,就可以换来15%~30%的效能提升,本质单核模拟双核!和异步编程的思想无异。
  2. 并不对劲的loj2134:uoj132:p2304:[NOI2015]小园丁与老司机
  3. Tyvj:1729 文艺平衡树(saply练习)
  4. Splay 区间反转
  5. linux内存管理之uboot第一步
  6. bzoj1798 1
  7. Create
  8. 在linq语言中,不能准确按拼音排序(转)
  9. Mysql 告警 :Establishing SSL connection without server&#39;s identity verification is not recommended.
  10. 使用oracle的保留字作为字段名称并进行操作的方法