Flask入门模板Jinja2语法与函数(四)
1 模板的创建
模板文件结构:
project/
    templates/
        模板文件跳转模板一般使用:
from flask import render_template,render_template_string
render_template
python    return render_template('index.html') #将index.html页面的内容读取出来并进行响应
render_template_string
python    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 %}从上面例子可以发现:
模板表达式是包含在分割符{{ }}内
模板控制语句都是包含在分割符{% %}中
模板注释都是包含在分隔符{# #}中
- 变量 : 视图传递过来的数据
{{ 变量名称 }}
- 标签 : 就是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 =  %}
{{ num }}
{% endwith %} 相关推荐
  bestallen    2020-08-17  
   JessePinkmen    2020-07-26  
   washing    2020-07-18  
   hzyuhz    2020-07-04  
   hzyuhz    2020-06-28  
   hzyuhz    2020-06-25  
   苦咖啡flask    2020-06-25  
   苦咖啡flask    2020-06-25  
   苦咖啡flask    2020-06-18  
   washing    2020-06-16  
   liuweiq    2020-06-14  
   wushaojun    2020-06-14  
   JessePinkmen    2020-06-14  
   kgshuo    2020-06-14  
   JessePinkmen    2020-06-14  
   bestallen    2020-06-13  
 