08-2-模板-表单、宏、闪现
引入表单扩展
使用Flask-WTF表单扩展,可以帮助进行CSRF验证,帮助我们快速定义表单模板,而且可以帮助我们在视图中验证表的数据
pip install Flask-WTF
不使用Flask-WTF扩展时
表单需要自己处理
#模板文件 <form method='post'> <input type="text" name="username" placeholder='Username'> <input type="password" name="password" placeholder='password'> <input type="submit"> </form>
from flask import Flask,render_template,request @app.route('/login',methods=['GET','POST']) def login(): if request.method == 'POST': username = request.form['username'] password = request.form['password'] print username,password return “success”
使用Flask-WTF扩展
# coding:utf-8 from flask import Flask, render_template, redirect, url_for, session from flask_wtf import FlaskForm from wtforms import StringField, PasswordField, SubmitField from wtforms.validators import DataRequired, EqualTo app = Flask(__name__)
app.config["SECRET_KEY"] = "xhosd6f982yfhowefy29f" # 1_定义表单的模型类 class RegisterForm(FlaskForm): """自定义的注册表单模型类""" # 名字 验证器/验证器 # DataRequired 保证数据必须填写,并且不能为空 user_name = StringField(label=u"用户名", validators=[DataRequired(u"用户名不能为空")]) password = PasswordField(label=u"密码", validators=[DataRequired(u"密码不能为空")]) password2 = PasswordField(label=u"确认密码", validators=[DataRequired(u"确认密码不能为空"), EqualTo("password", u"两次密码不一致")]) submit = SubmitField(label=u"提交") @app.route("/register", methods=["GET", "POST"]) def register(): # 创建表单对象, 如果是post请求,前端发送了数据,flask会把数据在构造form对象的时候,存放到对象中 form = RegisterForm() # get 请求的时候,form 里面的数据是空 # 判断form中的数据是否合理 # 如果form中的数据完全满足所有的验证器,则返回真,否则返回假 if form.validate_on_submit(): # 表示验证合格,不合格,会返回表单 # 提取数据 uname = form.user_name.data pwd = form.password.data pwd2 = form.password2.data print(uname, pwd, pwd2) session["user_name"] = uname return redirect(url_for("index")) return render_template("register.html", form=form) @app.route("/index") def index(): user_name = session.get("user_name", "") return "hello %s" % user_name if __name__ == '__main__': app.run(debug=True)

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form method="post"> {{ form.csrf_token }} {{ form.user_name.label }} <p>{{ form.user_name }}</p> {% for msg in form.user_name.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>
模板宏的使用
模板的复用,模板文件中,有很多重复的代码或组件,可以利用宏,在多个地方复用。有点想Python 中的函数
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>闪现</h1> {% for msg in get_flashed_messages() %} <p>{{ msg }}</p> {% endfor %} <hr/> {# 宏 类似函数 #} {% macro input() %} <input type="text" value="" size="30"> {% endmacro %} <h1>input 1</h1> {# 使用宏 #} {{ input() }} <h1>input 2</h1> {{ input() }} <hr/> {# ---------------#} {% macro input_args(type, value, size) %} <input type="{{ type }}" value="{{ value }}" size="{{ size }}"> {% endmacro %} <h1>带参数的宏</h1> {{ input_args("password", "", 50) }} <hr/> {# 带参数 ,默认参数 #} {% macro input_default_args(type="text", value="", size=30) %} <input type="{{ type }}" value="{{ value }}" size="{{ size }}"> {% endmacro %} <h1> 默认参数 </h1> {{ input_default_args() }} <h1>替换默认参数 </h1> {{ input3("password", "", 100) }} <hr/> {% import "macro_input.html" as m_input %} <h1> 导入宏 </h1> {{ m_input.input4() }} </body> </html>
宏定义在外部的使用
{#在另一个 html 文件中定义宏函数 #} {% macro input4(type="text", value="", size=30) %} <input type="{{ type }}" value="{{ value }}" size="{{ size }}"> {% endmacro %}
有点像Python 的模块导入,导入另一个模块中的函数,
{% import "macro_input.html" as m_input %} <h1> 导入宏 </h1> {{ m_input.input4() }}
模板的闪现使用
后端定义,前端循环调用
# coding:utf-8 from flask import Flask, render_template, flash app = Flask(__name__) flag = True app.config["SECRET_KEY"] = "SDHFOSDF" # flash 要用到session ,想要设置SECRET_KEY 不然会报错 @app.route("/") def index(): if flag: # 添加闪现信息,是存到session 中去的 # 存放信息,前端可以取 # 用法:自定义的提示信息,表单验证的时候,添加自己的错误提示信息 flash("hello1") flash("hello2") flash("hello3") # global flag # flag = False return render_template("index.html") if __name__ == '__main__': app.run(debug=True)
<h1>闪现</h1> {% for msg in get_flashed_messages() %} <p>{{ msg }}</p> {% endfor %} <hr/>
本文来自博客园,作者:元贞,转载请注明原文链接:https://www.cnblogs.com/yuleicoder/articles/10286905.html