• Flask入门模板Jinja2语法与函数(四)


    1 模板的创建

    模板文件结构:

    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 %}
    
  • 相关阅读:
    Mining of Massive Datasets – Link Analysis
    在web.config里修改配置从而对匿名用户拒绝提供某资源
    SharePoint 2010中的lockdown模式
    Managed Metadata Service介绍系列 之二
    Managed Metadata Service介绍系列 之一
    ASP.NET基础再出发系列 之一
    SharePoint的web.config文件中的validateRequest
    创建Business Data Connectivity Service之后遇报错“There are no addresses available for this application”
    [经典文章翻译] [未完工] [96更新] 在.NET Framework中针对RealTime技术的性能注意事项
    SharePoint 2010中, SPEventReceiverBase.EnableEventFiring和DisableEventFiring都已废弃(obsolete), 应使用SPEventReceiverBase.EventFiringEnabled
  • 原文地址:https://www.cnblogs.com/why957/p/9117415.html
Copyright © 2020-2023  润新知