由于Django的模板引擎和Flask中的Jinja2模板引擎有很多一样的地方,所以我将一样的地方总结到了独立的文章中

https://www.cnblogs.com/kuxingseng95/articles/9091027.html

变量

构造上下文

构造上下文前

 return render_template('test01_template.html', my_list=my_list, my_int=my_int, my_dict=my_dict)

构造上下文后

return render_template('test01_template.html', context=context)
return render_template('test01_template.html', **context)

比如:

from flask import Flask, render_template

app = Flask(__name__)

@app.route("/index")
def index():
# 处理业务逻辑
data = {
"name": "python",
"age": 18,
"my_li": [1, 2, 3, 4, 5, 6, 7],
"my_int": 0,
"my_dict": {
"city": "bj"
}
}
return render_template("code_18_templates.html", **data) if __name__ == '__main__':
app.run(debug=True)

和Django不同,在Flask的Jinja2模板引擎中,{{变量}}中是支持计算的

过滤器

jinja2中过滤器可以传入多个参数。

{{参数1 | 过滤器器(*args) }} 
{{ my_list2 | sum(‘age’) }}

而且支持链式调用

 {{ 'hello world' | reverse | upper }}

自定义过滤器

使用装饰器

from flask import Flask, render_template

app = Flask(__name__)

@app.route("/")
def index():
return render_template("code_19_filter.html") # 自定义过滤器
#  定义一个切片函数
@app.template_filter("li2") # 里面的参数表示过滤器的名字
def li_setup2(li):
# 每隔一个值获取一下
step = li[::2]
return step if __name__ == '__main__':
app.run()

直接添加到模板过滤器中

from flask import Flask, render_template

app = Flask(__name__)

@app.route("/")
def index():
return render_template("code_19_filter.html") #  定义一个切片函数
def li_setup2(li):
# 每隔一个值获取一下
return li[::2] # 自定义过滤器
# 第一个参数:表示自定义的函数名字,
# 第二个参数表示过滤器的名字
app.add_template_filter(li_setup2, "li2") if __name__ == '__main__':
app.run()

控制语句

与Django模板不同点

for循环后面可以拼接if语句

比较平时使用时我们需要这样:

{% for index in my_list %}
{% if index > 5 %}
{{ index }}
{% endif %}
{% endfor %}

而Flask中可以这样:

{% for index in my_list if index > 5 %}
{{index}}
{% endfor %}

比如在判断列表为空的时候

Django和jinja2也不一样

jinja2中

{% for index in my_list %}
{{index}}
{% else %}
没有值了
{% endfor %}

django中

{% for index in my_list %}
{{index}}
{% empty %}
没有值了
{% endfor %}

可以将它看成时Jinja2中的一个函数,它会返回一个模板或者HTML字符串

可以将相同的重复编写的模板代码封装到宏中

使用

标签

{% macro func() %}
{% endmacro %}

准备宏

{% macro input(label='', type='text', name='', value='') %}
<label>{{ label }}</label><input type="{{ type }}" name="{{ name }}" value="{{ value }}"><br>
{% endmacro %}

使用宏

<form action="">
{{ input(label='⽤用户名:', name='user_name') }}
{{ input(label='邮箱:', name='email') }}
{{ input(label='密码:', type='password', name='password') }}
{{ input(label='确认密码:', type='password', name='password2') }}
{{ input(type='submit', value='提交') }}
</form>

封装宏

为了达到宏的复用,我们可以将宏单独的抽取到指定的html文件中

使用封装的宏

{% import 'macro.html' as func %}
<form action="">
{{ func.input(label='⽤用户名:', name='user_name') }}
{{ func.input(label='邮箱:', name='email') }}
{{ func.input(label='密码:', type='password', name='password') }}
{{ func.input(label='确认密码:', type='password', name='password2') }}
{{ func.input(type='submit', value='提交') }}
</form>

Flask中特有的模板变量和方法

特有变量

比如:

特有变量:

request:获取请求的数据

session:获取session数据

config:获取配置参数

g:获取视图中g变量存储的值

特有方法

url_for()

@app.route("/order/<order_id>")
def order(order_id):
return 'order %s' % order_id

超链接中的反向解析,和重定向中的反向解析用法一致

比如在视图函数中定义了

@app.route('/order')
def order():
return "order"

然后再模板中

<a href="{{ url_for('order') }}">进⼊入order</a>

可以进行反向的解析

反向的解析传参

@app.route("/order/<order_id>")
def order(order_id):
return "order %s" % order_id
<a href="{{ url_for('order', order_id=123) }}">进⼊入order</a>

get_flashed_messages()

搭配flask中国的flash()方法使用

flash()用于将视图中准备的提示信息添加到消息队列中

然后模板中使用get_flashed_messages()提取和展示视图中准备的提示信息

使用

{% for message in get_flashed_messages() %}
{{message}}
{% endfor %}

Flask-WTF表单

首先需要安装 Flask-WTF == 0.14.2

常用模块

表单类

from flask_wtf import FlaskForm 

字段

from wtforms import StringField, PasswordField, SubmitField 

验证器

from wtforms.validators import DataRequired, InputRequired, EqualTo

例子:

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

前台代码

from flask import Flask, render_template
from flask import request
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired, EqualTo app = Flask(__name__) class Config(object):
SECRET_KEY = "fadafsfafsafa" app.config.from_object(Config) # FlaskForm:继承flask的表单
class RegisterForm(FlaskForm):
# StringField :文本输入框
# validators :用来验证当前的文本输入框
# DataRequired:必须输入
user_name = StringField(label="用户名", validators=[DataRequired("必须填写用户名")])
password = PasswordField(label="密码", validators=[DataRequired("必须填写密码")])
# EqualTo : 判断两次密码是否相等
# password :  表示跟上面的密码进行判断,判断两次是否一致
password2 = PasswordField(label="确认密码", validators=[DataRequired("必须填写密码"), EqualTo("password", "两次密码必须一致")])
submit = SubmitField(label="提交") @app.route("/register", methods=["GET", "POST"])
def register():
if request.method == "GET":
form = RegisterForm()
return render_template("code_22_wtf.html", form=form)
else:
form = RegisterForm() if form.validate_on_submit(): name = form.user_name.data
pwd = form.password.data
pwd2 = form.password2.data
print(name, pwd)
return "注册成功"
else:
return render_template("code_22_wtf.html", form=form) if __name__ == '__main__':
app.run(debug=True)

后台代码

关于csrf

关于csrf的简单介绍:https://www.cnblogs.com/kuxingseng95/articles/9092333.html

防护措施

方案一:在FlaskForm中实现校验

在Flask-WTF扩展中,有一套完整的csrf防护体系

<form method="post">
{{ form.csrf_token() }}
{{ form.username.label }} {{ form.username }}<br/>
{{ form.password.label }} {{ form.password }}<br/>
{{ form.password2.label }} {{ form.password2 }}<br/>
{{ form.submit }}
</form>

方案二:单独使用

from flask.ext.wtf import CSRFPRrotect

CSRFProtect(app)

使用WTF拓展

同方案一

不使用WTF拓展

自己实现校验的所有逻辑

<form method="post" action="/">
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
</form>

flask模板语言的更多相关文章

  1. Flask - 模板语言jinja2 和render_template高级用法

    目录 Flask - 模板语言jinja2 和render_template高级用法 一. 字典传递至前端 二. 列表传入前端Jinja2 模板的操作: 三. 大字典传入前端 Jinja2 模板 四. ...

  2. flask模板语言,装饰器,路由及配置

    1.模板语言jinja2 Flask中默认的模板语言是Jinja2 1.0 模板传参 from flask import Flask,render_template app = Flask(__nam ...

  3. flask模板语言 jinja2 以及render_template 深度用法

    是时候开始写个前端了,Flask中默认的模板语言是Jinja2 现在我们来一步一步的学习一下 Jinja2 捎带手把 render_template 中留下的疑问解决一下 首先我们要在后端定义几个字符 ...

  4. Flask 模板语言,装饰器

      Jinja2模板语言 # -*- coding: utf-8 -*-   from flask import Flask, render_template, request, redirect,  ...

  5. Flask 模板语言

    Flask使用的是Jinja2模板引擎 举个例子: from flask import Flask, render_template app = Flask(__name__) @app.route( ...

  6. 【Flask】 Jinja2模板语言

    Jinja2 Jinja2是Python Web编程中的主流模板语言.因为flask是基于Jinja2和Werkzeug发展而来,在安装flask的时候jinja2自动就被装在上面了. 之前提到了很多 ...

  7. 第四篇flask中模板语言 jinja2

    Flask中默认的模板语言是Jinja2 首先我们要在后端定义几个字符串,用于传递到前端 STUDENT = {, 'gender': '中'}, STUDENT_LIST = [ {, 'gende ...

  8. Flask最强攻略 - 跟DragonFire学Flask - 第四篇 Flask 中的模板语言 Jinja2 及 render_template 的深度用法

    是时候开始写个前端了,Flask中默认的模板语言是Jinja2 现在我们来一步一步的学习一下 Jinja2 捎带手把 render_template 中留下的疑问解决一下 首先我们要在后端定义几个字符 ...

  9. python 全栈开发,Day119(Flask初识,Render Redirect HttpResponse,request,模板语言 Jinja2,用户登录例子,内置Session)

    一.Flask初识 首先,要看你学没学过Django 如果学过Django 的同学,请从头看到尾,如果没有学过Django的同学,并且不想学习Django的同学,轻饶过第一部分 三大主流Web框架对比 ...

随机推荐

  1. lightoj1145 【DP优化求方案】

    题意: 有一个k面的骰子,然后问你n个骰子朝上的面数字之和=s的方案: 思路: dp[i][j] 代表 前 i 个骰子组成 j 有多少种方案: 显然 dp[i][j] = dp[i - 1][j - ...

  2. 51nod 1376【线段树维护区间最大值】

    引自:wonter巨巨的博客 定义 dp[i] := 以数字 i(不是下标 i)为结尾的最长上升长度 然后用线段树维护 dp[i]: 每个节点维护 2 个信息,一个是当前区间的最大上升长度,一个是最大 ...

  3. 关于 T[] 的反射问题

    1. T[] 类型不适应以下代码 Dictionary<string, Test> d = new Dictionary<string, Test>(); // Get a T ...

  4. spoj3105 MOD - Power Modulo Inverted(exbsgs)

    传送门 关于exbsgs是个什么东东可以去看看yyb大佬的博客->这里 //minamoto #include<iostream> #include<cstdio> #i ...

  5. 【NOI省选模拟】小奇的花园

    「题目背景」 小奇在家中的花园漫步时,总是会思考一些奇怪的问题. 「问题描述」 小奇的花园有n个温室,标号为1到n,温室以及以及温室间的双向道路形成一棵树. 每个温室都种植着一种花,随着季节的变换,温 ...

  6. 后台管理系统·快速开发框架JSite

    平台介绍 框架基于Maven构建,拆分成多个子模块,层次结构清晰.可用于所有Web应用,如企业后台管理系统.OA系统.CMS.CRM等. 框架本身集成了最新的 Flowable工作流引擎 https: ...

  7. [題解]BZOJ_1260_塗色

    簡單的區間dp,結果竟然寫掛了......還掛的很徹底......狗屎 如果區間左右端點相等,那麼不需要在多花一次去刷,對 f [ i+1 ] [ j ],f [ i ] [ j-1 ]取個min, ...

  8. CF ECR59div2 D

    题目本质:如果答案是i,那么从行和列两维都会满足:以i的倍数分块,矩阵值相同. 一种解决方法: 1.首先题目里说了要在n的约数里找orzorz…… 2.块中需要一整排都相同.用“与前一排相同否?”来判 ...

  9. [aspnetcore]asp.net core程序部署到Ubuntu中的路径问题

    先标记下正确写法 new FileInfo(Environment.CurrentDirectory + "/Config/Log4net.config") 很多同行喜欢这样写: ...

  10. python学习day13

    目录 JavaScript Dom jQuery JavaScript JavaScript 是世界上最流行的编程语言. 这门语言可用于 HTML 和 web,更可广泛用于服务器.PC.笔记本电脑.平 ...