转载https://www.cnblogs.com/why957/p/9117415.html

1 模板的创建

模板文件结构:

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。
project/
    templates/
        模板文件

跳转模板一般使用:

from flask import render_template,render_template_string

render_template

return render_template('index.html') #将index.html页面的内容读取出来并进行响应

render_template_string

return render_template_string('<h1>index</h1>') #可以执行html标签语句

2 flask模板引擎Jinja2语法:

概述: 模板类似于MVC模式下的view视图层,模板引擎其实就是用来将模板同业务代码分离,并解析模板语言的程序.

比如模板代码

<!doctype html>
<title>Hello template</title>
{% if name %} <h1>Hello {{ name }}!</h1> {% else %} <h1>Hello flask!</h1> {% endif %}

从上面例子可以发现:

模板表达式是包含在分割符{{ }}内

模板控制语句都是包含在分割符{% %}中

模板注释都是包含在分隔符{# #}中

  1. 变量 : 视图传递过来的数据

    {{ 变量名称 }}

  2. 标签 : 就是python中的循环\分支结构...

    {% 标签名称 %}

(1)表达式一般分为以下几种:

表达式种类 举例
变量(最常用) {{ name }}
基础类型( 字符串,数值,列表,元祖,字典,布尔值) 一般配合表达式使用{{ 'string' }}
运算表达式(算术与逻辑) {{ False and True }} {{ 2 + 3 }}
过滤器' | ' ,测试器' is ' 一般配合表达式
函数调用 {{ func( ) }}
“in”操作符 {{ 1 in [1,2,3] }}
字符串连接符”~” {{ ~'like'~ }}

(2)控制语句一般有:

<dl>
{% for user in users if not user.hidden %} {% if loop.first %} # 第一次if判定 <div>User List:</div> {% endif %} <div class="{{ loop.cycle('odd', 'even') }}"> <dt>User No {{ loop.index }}:</dt> <dd>{{ user.name }}</dd> </div> {% if loop.last %} #最后一次if判定 <div>Total Users: {{ loop.length }}</div> {% endif %} {% else %} #都不满足执行else <li>No users found</li> {% endfor %} </dl>

if elif else

{% if data.bool %} {{ data.bool }}为真 {% elif data.none %} {{ data.none }}为真 {% else %} 以上都为假 {% endif %}

for in 循环

{% for k,v in data.items() %} <li>{{ foo }}</li> <li>{{ data.abcd }}</li> <li>{{ k }}==>{{ v }}</li> {% endfor %}

和else搭配

{% for in %} ... {% else %} ... {% endfor %}

注意 : 当进行迭代的对象不存在时 则执行else

Jinja2的循环内置变量获取当前迭代状态:

变量 描述
loop.index 获取当前迭代的索引,从1开始
loop.index0 获取当期迭代的索引 从0开始
loop.first 是否为第一次迭代,返回True或者False
loop.last 是否为最后一次迭代 返回True或者False
loop.length 迭代的长度
loop.depth 当前循环在递归中的层级(从1开始)
loop.depth0 当前循环在递归中的层级(从0开始)
(3)忽略,转义,赋值
{% raw %}#忽略模板语法 <ul> {% for k,v in items %} <li>{{ k,v }}</li> {% endfor %} </ul> {% endraw %} Flask会对”.html”, “.htm”, “.xml”, “.xhtml”这四种类型的模板文件开启HTML格式自动转义。这样也可以防止HTML语法注入. {% autoescape false %} #将自动转义关闭 <h1>Hello {{ name }}!</h1> {% endautoescape %} {% set items = [1,5] %} #使用set关键字给变量赋值

3 模板变量函数

(1) 请求对象request : 它本身是一个字典,dict['key'] 或者是dict.get['key']

表达式 含义
request.method 获取请求的方法,post get
request.form 获取表单数据
request.args 请求的参数
request.url 获取完整的请求url
request.base_url 获取去掉传参的url
request.host_url 获取主机名部分的url
request.files 获取form表单文件上传的数据
request.cookies 获取cookie信息
request.headers 获取请求头信息

(2) 会话对象session:本身也是一个字典

session['user'] = u'张三' 设置session需要设置秘钥 app.secret_key = '123456' 或者在配置文件 app.config['SECRET_KEY'] = '123456'

(3) url_for()函数:通过视图找到路由

<link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">

(4) with与set

#set 添加变量 {% set name='张三' %} #set也可赋值给列表或元组 {% set navigation = [('index.html', 'Index'), ('about.html', 'About')] %}

with语句可以创建内部作用域,主要是起到隔离作用

#在with该作用域下可以使用 {% with num = 42 %} {{ num }} {% endwith %}
扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄