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>
register.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/>

 

 

 

posted @ 2019-01-18 16:59  元贞  阅读(160)  评论(0)    收藏  举报