jinja2_jinja2 加法 - CSDN
精华内容
参与话题
  • Jinja2 中文手册

    2019-07-25 16:17:19
    欢迎来到 Jinja2 Jinja2 是一个现代的,设计者友好的,仿照 Django 模板的 Python 模板语言。 它速度快,被广泛使用,并且提供了可选的沙箱模板执行环境保证安全: <title>{% block title %}{% endblock ...

    欢迎来到 Jinja2

    Jinja2 是一个现代的,设计者友好的,仿照 Django 模板的 Python 模板语言。 它速度快,被广泛使用,并且提供了可选的沙箱模板执行环境保证安全:

    <title>{% block title %}{% endblock %}</title>
    <ul>
    {% for user in users %}
      <li><a href="{{ user.url }}">{{ user.username }}</a></li>
    {% endfor %}
    </ul>
    

    特性:

    • 沙箱中执行
    • 强大的 HTML 自动转义系统保护系统免受 XSS
    • 模板继承
    • 及时编译最优的 python 代码
    • 可选提前编译模板的时间
    • 易于调试。异常的行数直接指向模板中的对应行。
    • 可配置的语法

    转载于:https://www.cnblogs.com/think90/p/10966184.html

    展开全文
  • Jinja2模块简介

    2019-07-29 15:42:21
    Jinja2 使用一个名为Environment的中心对象。这个类的实例用于存储配 置、全局对象,并用于从文件系统或其它位置加载模板。即使你通过:class:Template类的构造函数用字符串创建模板,也会为你自动创建一个环境,尽管...

    前言

    Jinja2 使用一个名为 Environment 的中心对象。这个类的实例用于存储配 置、全局对象,并用于从文件系统或其它位置加载模板。即使你通过:class:Template 类的构造函数用字符串创建模板,也会为你自动创建一个环境,尽管是共享的。

    大多数应用在应用初始化时创建一个 Environment 对象,并用它加载模板。 在某些情况下,如果使用多份配置,使用并列的多个环境无论如何是有用的。

    配置 Jinja2 为你的应用加载文档的最简单方式看起来大概是这样:

    from jinja2 import Environment, PackageLoader
    env = Environment(loader=PackageLoader('yourapplication', 'templates'))

    这会创建一个默认设定下的模板环境和一个在 yourapplication python 包中的 templates文件夹中寻找模板的加载器。多个加载器是可用的,如果你需要从  数据库或其它资源加载模板,你也可以自己写一个。

    你只需要调用 get_template() 方法从这个环境中加载模板,并会返回已加载的 Template:

    template = env.get_template('mytemplate.html')

    用若干变量来渲染它,调用 render() 方法:

    print(template.render(the='variables', go='here'))

    使用一个模板加载器,而不是向 Template 或 Environment.from_string() 传递字符串,有许多好处。除了使用上便利, 也使得模板继承成为可能。

     

    有关更多内容访问:http://docs.jinkan.org/docs/jinja2/api.html

    展开全文
  • jinja2模块使用教程

    2019-10-05 11:40:23
     要了解jinja2,那么需要先理解模板的概念。模板在Python的web开发中广泛使用,它能够有效的将业务逻辑和页面逻辑分开,使代码可读性增强、并且更加容易理解和维护。  模板简单来说就是一个其中包涵占位变量表示...

    模板

      要了解jinja2,那么需要先理解模板的概念。模板在Python的web开发中广泛使用,它能够有效的将业务逻辑和页面逻辑分开,使代码可读性增强、并且更加容易理解和维护。

      模板简单来说就是一个其中包涵占位变量表示动态的部分的文件,模板文件在经过动态赋值后,返回给用户。  --> 可以理解为渲染

      python中自带一个简单的模板,就是string提供的。

    import string
    a = string.Template('$who is $role')
    a.substitute(who='daxin',role='Linux')
    'daxin is Linux'
    a.substitute(who='daxin',role='cat')
    'daxin is cat'

      Python自带的模板功能极其有限,如果我们想要在模板中使用控制语句,和表达式,以及继承等功能的话,就无法实现了。

      目前主流的模板系统,最常用的就是jinja2和mako

    jinja2介绍

      jinja2是Flask作者开发的一个模板系统,起初是仿django模板的一个模板引擎,为Flask提供模板支持,由于其灵活,快速和安全等优点被广泛使用。

    jinja2的优点

      jinja2之所以被广泛使用是因为它具有以下优点:

      1. 相对于Template,jinja2更加灵活,它提供了控制结构,表达式和继承等。
      2. 相对于Mako,jinja2仅有控制结构,不允许在模板中编写太多的业务逻辑。
      3. 相对于Django模板,jinja2性能更好。
      4. Jinja2模板的可读性很棒。

    安装jinja2

      由于jinja2属于第三方模块,首先需要对其进行安装

    1
    pip3 install jinja2

      测试模板是否安装成功

    1
    2
    3
    4
    python -c "import jinja2"
     
    # 没有报错就表示安装成功
    # 必须用双引号"

    jinja2语法

      作为一个模板系统,它还提供了特殊的语法,我们按照它支持的语法进行编写之后,就能使用jinja2模块进行渲染。

    基本语法

       在jinja2中,存在三种语法:

      1. 控制结构 {% %}
      2. 变量取值 {{ }}
      3. 注释 {# #}

      下面是一个简单的jinja2例子

    1
    2
    3
    4
    5
    6
    7
    {# This is jinja code
     
        {% for file in filenames %}
        ...
        {% endfor %}
     
    #}

      可以看到,for循环的使用方式和Python比较类似,但是没有了句尾的冒号,另外需要使用endfor最为结尾,其实在jinja2中,if也是一样的,结尾需要使用endif。

    jinja2变量

      jinja2模板中使用 {{ }} 语法表示一个变量,它是一种特殊的占位符。当利用jinja2进行渲染的时候,它会把这些特殊的占位符进行填充/替换,jinja2支持python中所有的Python数据类型比如列表、字段、对象等。

    1
    2
    3
    <p>this is a dicectory:{{ mydict['key'] }} </p>
    <p>this is a list:{{ mylist[3] }} </p>
    <p>this is a object:{{ myobject.something() }} </p>

    jinja2中的过滤器

      变量可以通过“过滤器”进行修改,过滤器可以理解为是jinja2里面的内置函数和字符串处理函数。

      常用的过滤器有:

    过滤器名称     说明    
    safe  渲染时值不转义
    capitialize  把值的首字母转换成大写,其他子母转换为小写
     lower  把值转换成小写形式 
     upper  把值转换成大写形式 
     title  把值中每个单词的首字母都转换成大写
     trim  把值的首尾空格去掉
     striptags  渲染之前把值中所有的HTML标签都删掉
    join   拼接多个值为字符串
     replace  替换字符串的值
     round  默认对数字进行四舍五入,也可以用参数进行控制
    int   把值转换成整型

       那么如何使用这些过滤器呢? 只需要在变量后面使用管道(|)分割,多个过滤器可以链式调用,前一个过滤器的输出会作为后一个过滤器的输入。

    {{ 'abc' | captialize  }}
    # Abc
     
    {{ 'abc' | upper  }}
    # ABC
     
    {{ 'hello world' | title  }}
    # Hello World
     
    {{ "hello world" | replace('world','daxin') | upper }}
    # HELLO DAXIN
     
    {{ 18.18 | round | int }}
    # 18

    jinja2的控制结构

      jinja2中的if语句类似与Python的if语句,它也具有单分支,多分支等多种结构,不同的是,条件语句不需要使用冒号结尾,而结束控制语句,需要使用endif关键字。

    {% if daxin.safe %}
    daxin is safe.
    {% elif daxin.dead %}
    daxin is dead
    {% else %}
    daxin is okay
    {% endif %}

    jinja2的for循环

      jinja2中的for循环用于迭代Python的数据类型,包括列表,元组和字典。在jinja2中不存在while循环。

      迭代列表

    <ul>
    {% for user in users %}
    <li>{{ user.username|title }}</li>
    {% endfor %}
    </ul>

      迭代字典

    <dl>
    {% for key, value in my_dict.iteritems() %}
    <dt>{{ key }}</dt>
    <dd>{{ value}}</dd>
    {% endfor %}
    </dl>

          当然也可以加入else语句,在循环正确执行完毕后,执行

          在for循环中,jinja2还提供了一些特殊的变量,用以来获取当前的遍历状态:

    变量 描述
    loop.index 当前迭代的索引(从1开始)
    loop.index0 当前迭代的索引(从0开始)
    loop.first 是否是第一次迭代,返回bool
    loop.last 是否是最后一次迭代,返回bool
    loop.length 序列中的项目数量
    loop.revindex 到循环结束的次数(从1开始)
    loop.revindex0 到循环结束的次数(从0开始)

    jinja2的宏

      宏类似于Python中的函数,我们在宏中定义行为,还可以进行传递参数,就像Python中的函数一样一样儿的。

      在宏中定义一个宏的关键字是macro,后面跟其 宏的名称和参数等

    {% macro input(name,age=18) %}   # 参数age的默认值为18
     
     <input type='text' name="{{ name }}" value="{{ age }}" >
     
    {% endmacro %}

      调用方法也和Python的类似

    <p>{{ input('daxin') }} </p>
    <p>{{ input('daxin',age=20) }} </p>

    jinja2的继承和Super函数

      jinja2中最强大的部分就是模板继承。模板继承允许我们创建一个基本(骨架)文件,其他文件从该骨架文件继承,然后针对自己需要的地方进行修改。

      jinja2的骨架文件中,利用block关键字表示其包涵的内容可以进行修改。

      以下面的骨架文件base.html为例:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        {% block head %}
        <link rel="stylesheet" href="style.css"/>
        <title>{% block title %}{% endblock %} - My Webpage</title>
        {% endblock %}
    </head>
    <body>
    <div id="content">{% block content %}{% endblock %}</div>
    <div id="footer">
        {% block  footer %}
        <script>This is javascript code </script>
        {% endblock %}
    </div>
    </body>
    </html>

      这里定义了四处 block,即:head,title,content,footer。那怎么进行继承和变量替换呢?注意看下面的文件

    {% extend "base.html" %}       # 继承base.html文件
     
    {% block title %} Dachenzi {% endblock %}   # 定制title部分的内容
     
    {% block head %}
        {{  super()  }}        # 用于获取原有的信息
        <style type='text/css'>
        .important { color: #FFFFFF }
        </style>
    {% endblock %}   
     
    # 其他不修改的原封不同的继承

      PS: super()函数 表示获取block块中定义的原来的内容

    利用jinja2进行渲染

      jinja2模块中有一个名为Enviroment的类,这个类的实例用于存储配置和全局对象,然后从文件系统或其他位置中加载模板。

    基本使用方法

      大多数应用都在初始化的时候撞见一个Environment对象,并用它加载模板。Environment支持两种加载方式:

    1. PackageLoader:包加载器
    2. FileSystemLoader:文件系统加载器

    PackageLoader

      使用包加载器来加载文档的最简单的方式如下:

    from jinja2 import PackageLoader,Environment
    env = Environment(loader=PackageLoader('python_project','templates'))    # 创建一个包加载器对象
     
    template = env.get_template('bast.html')    # 获取一个模板文件
    template.render(name='daxin',age=18)   # 渲染

      其中:

    1. PackageLoader()的两个参数为:python包的名称,以及模板目录名称。
    2. get_template():获取模板目录下的某个具体文件。
    3. render():接受变量,对模板进行渲染

    FileSystemLoader

      文件系统加载器,不需要模板文件存在某个Python包下,可以直接访问系统中的文件。

    转载于:https://www.cnblogs.com/sui776265233/p/10570712.html

    展开全文
  • Jinja2模板引擎官方文档详细介绍了其中的API函数、沙箱、模板设计文档等,这里主要就一些常用的知识点进行总结。

    Jinja2模板引擎官方文档详细介绍了其中的API函数、沙箱、模板设计文档等,这里主要就一些常用的知识点进行总结。

    0x01 模板基础

    常见的几种模板语句如下:

    {%...%}     #运行Jinja2的语句;
    {{…}}       #在页面中打印Jinja2运行的结果
    {#...#}     #注释

    看下面的例子:

    (1)views.py

    from flask import render_template
    
    @app.route('/index')
    def index():
        return render_template('index1.html',
                               name='kikay',
                               age=20)

    (2)templates文件夹下新建模板index1.html:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Test</title>
    </head>
    <body>
    <p>测试</p>
    <p>直接输出姓名:{{name}}</p>
    {#这是注释:判断是否存在age#}
    {%if age%}
    <p>年龄:{{age}}</p>
    {%else%}
    <p>不存在年龄</p>
    {%endif%}
    </body>
    </html>

    输出效果:

    如果想输入原始的Jinja2语句,而不是作为特殊字符进行解析,可以包含在{%raw%}…{%%endraw}中:
    views.py

    @app.route('/raw')
    def raw():
        return render_template('raw.html',name='kikay')

    raw.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Raw</title>
    </head>
    <body>
    <div>
        <p>姓名:{{name}}</p>
        {%raw%}
        <p>转义姓名:{{name}}</p>
        {%endraw%}
    </div>
    </body>
    </html>

    效果如下:

    上面的例子都需要调用render_template('*.html',var_key=***)来渲染模板。其中的函数render_template是把Jinja2模板引擎集成到程序中。Jinja2 能识别所有类型的变量,甚至是一些复杂的类型,例如列表、字典和对象。

    0x02 控制语句

    添加一些控制语句,index2.html如下:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>{{title}}</title>
    </head>
    <body>
    <div>
        {%if author%}
        <h1>Hello,{{author}}</h1>
        {%else%}
        <h1>Nobody</h1>
        {%endif%}
    </div>
    </body>
    </html>

    views.py:

    @app.route('/index2')
    def index2():
        author='kikay'
        return render_template('index2.html',
                               author=author)

    输出:

    注释掉author:

    @app.route('/index2')
    def index2():
        author='kikay'
        return render_template('index2.html')
                               #author=author)

    效果如下:

    当参数不存在时,Jinja2模板在渲染时直接忽略掉。更复杂一些,现在还要输出作者好友的列表。

    index3.html:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Firends</title>
    </head>
    <body>
    <div>
        <h1>作者:{{author.name}}</h1>
        <table>
            <thread>
                <th>姓名</th>
                <th>年龄</th>
            </thread>
            {%for f in author.friends%}
            <tr>
                <td>{{f.name}}</td>
                <td>{{f.age}}</td>
            </tr>
            {%endfor%}
        </table>
    
    </div>
    </body>
    </html>

    views.py:

    @app.route('/index3')
    def index3():
        author={
            'name':'kikay',
            'age':20,
            'friends':[
                {'name':'Andy','age':60},
                {'name':'Tom','age':29},
                {'name':u'小花','age':18}
            ]
        }
        return render_template('index3.html',
                               author=author)

    效果如下:

    这里需要指出的是,输出带有中文时,注意编码的问题。类似于Python中函数的定义,Jinja2模板引擎中的macro关键字可以看成是一个函数的定义:

    {%macro showinfo(info)%}
    这是{{info}}!!!<br />
    {%endmacro%}
    {%for info in infos%}
    {{showinfo(info)}}
    {%endfor%}

    0x03 模板继承

    随着应用的拓展,我们可能在多个页面中使用了相同的HTML代码,并且需要每一个页面都同步,和其他模板引擎一样,Jinja2也支持模板继承。我们在templates下新建一个layout_base.html文件,内容如下:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        {%if title%}
        <title>{{title}}</title>
        {%else%}
        <title>No title</title>
        {%endif%}
        <!--一引入js文件-->
        {%block script%}
        <script src="test.js"></script>
        {%endblock%}
    </head>
    <body>
    <div>
        {%block t1%}{%endblock%}
        <p>----------模板分隔符------------</p>
        {%block t2%}{%endblock%}
    </div>
    </body>
    </html>

    里面有3个block标签,这是为继承该模板的html模板替换使用的。新建index4.html继承layout_base.html:

    {%extends 'layout_base.html'%}
    {%block script%}
    {{super()}}
    <script src="test2.js"></script>
    {%endblock%}
    
    {%block t1%}
    {%if author%}
    <h1>Hello,{{author.name}}</h1>
    {%else%}
    <h1>Nobody</h1>
    {%endif%}
    {%endblock%}
    
    {%block t2%}
    <table>
        <thread>
            <th>姓名</th>
            <th>年龄</th>
        </thread>
        {%for f in author.friends%}
        <tr>
            <td>{{f.name}}</td>
            <td>{{f.age}}</td>
        </tr>
        {%endfor%}
    </table>
    {%endblock%}

    效果如下:

    extends指明该模板是从哪个模板继承而来的。上面例子中的{{super()}},因为模板中其中包含的内容不是空的,所以需要用{{super()}}来获取原来的内容。如果一个html中包含1个以上的extends标签就会报错,即最多继承于1个模板。

    0x04 模板设计

    Flask集成了Bootstrap包,可以使用Flask-Bootstrap来渲染模板,首先需要安装(利用pip):

    pip install flask-bootstrap

    具体过程参见以前的博客(Flask学习总结笔记(1)– 环境配置)。

    __init__.py中初始化Flask-Bootstrap:

    from flask.ext.bootstrap import Bootstrap

    修改后的完整__init__.py如下:

    #!flask/bin/env python
    #coding:utf-8
    
    __author__ = 'kikay'
    
    from flask import Flask
    from flask.ext.bootstrap import Bootstrap
    
    #定义app对象
    app=Flask(__name__)
    #定义Bootstrap对象
    bootstrap=Bootstrap(app)
    
    from app import views

    完成Flask-Bootstrap初始化后,就可以在程序中使用一个包含全部Bootstrap文件的基模板。这个模板利用Jinja2的模板继承机制,让程序扩展一个具有基本页面结构的基模板,其中就有用来引入 Bootstrap 的元素。(官方教程),关于Bootstrap的内容可以参看我的博客(Bootstrap学习总结笔记)。

    下面是实现一个导航样式的例子:

    bootstrap.html

    <!--引入Flask-Bootstrap中的基模板-->
    {%extends 'bootstrap/base.html'%}
    
    <!--添加html属性-->
    {%block html_attribs%}lang="zh-cn"{%endblock%}
    
    <!--添加metas标签-->
    {%block metas%}
        {{super()}}
        <meta charset="UTF-8">
    {%endblock%}
    
    <!--添加网页的样式-->
    {%block styles%}
        {{super()}}
        <link rel="stylesheet" href="{{url_for('.static',filename='css/block.css')}}">
    {%endblock%}
    
    {%block scripts%}
        {{super()}}
        <script src="{{url_for('.static',filename='js/block.js')}}"></script>
    {%endblock%}
    
    <!--网页标题-->
    {%block title%}Flask-Bootstrap{%endblock%}
    
    <!--网页导航-->
    {%block navbar%}
    <div class="container">
        <nav class="navbar navbar-inverse">
            <div class="navbar-header">
                <button type="button" class="btn btn-default navbar-toggle" data-toggle="collapse" data-target="#navbar">
                    <span class="sr-only">Toggle navigation</span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </button>
                <a href="#" class="navbar-brand">网站标题</a>
            </div>
            <div class="collapse navbar-collapse" id="navbar">
                <ul class="nav navbar-nav">
                    <li class="active"><a href="#">首 页</a></li>
                    <li><a href="#">新闻</a></li>
                    <li class="dropdown">
                        <a href="#" class="dropdown-toggle" data-toggle="dropdown">
                            下拉菜单
                            <span class="caret"></span>
                        </a>
                        <ul class="dropdown-menu">
                            <li><a href="#">菜单1</a></li>
                            <li><a href="#">菜单2</a></li>
                            <li><a href="#">菜单3</a></li>
                        </ul>
                    </li>
                </ul>
                <form class="nav navbar-form navbar-right">
                    <div class="form-group">
                        <input type="text" class="form-control" placeholder="用户名">
                    </div>
                    <div class="form-group">
                        <input type="password" class="form-control" placeholder="密码">
                    </div>
                    <div class="form-group">
                        <button type="submit" class="btn btn-primary form-control">提 交</button>
                    </div>
                </form>
            </div>
        </nav>
    </div>
    {%endblock%}
    
    <!--网页正文-->
    {%block content%}
    <div class="container">
        <div class="page-header">
            {%if author%}
            <h1>Hello,{{author.name}}</h1>
            {%else%}
            <h1>Nobody</h1>
            {%endif%}
        </div>
        <div class="col-center-block">
            <!--展示朋友列表-->
            {%if author.friends%}
            <table class="table table-bordered table-striped table-hover table-condensed">
                <thead class="alert-danger">
                    <th>姓名</th>
                    <th>年龄</th>
                </thead>
                {%for f in author.friends%}
                <tr class="alert-success">
                    <td>{{f.name}}</td>
                    <td>{{f.age}}</td>
                </tr>
                {%endfor%}
            </table>
            {%endif%}
        </div>
    </div>
    <script>
    </script>
    {%endblock%}

    views.py:

    @app.route('/bootstrap')
    def bootstrap():
        author={
            'name':'kikay',
            'age':20,
            'friends':[
                {'name':'Andy','age':60},
                {'name':'Tom','age':29},
                {'name':u'小花','age':18}
            ]
        }
        return render_template('bootstrap.html',
                               author=author,
                               title='Bootstrap')

    效果如下:

    看下源代码,可以更好理解这种渲染的效果。

    <!--引入Flask-Bootstrap中的基模板-->
    <!DOCTYPE html>
    <htmllang="zh-cn">
      <head>
        <title>Flask-Bootstrap</title>
    
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta charset="UTF-8">
    
    
        <!-- Bootstrap -->
        <link href="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
        <link rel="stylesheet" href="/static/css/block.css">
    
      </head>
      <body>
    
    <div class="container">
        <nav class="navbar navbar-inverse">
            <div class="navbar-header">
                <button type="button" class="btn btn-default navbar-toggle" data-toggle="collapse" data-target="#navbar">
                    <span class="sr-only">Toggle navigation</span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </button>
                <a href="#" class="navbar-brand">网站标题</a>
            </div>
            <div class="collapse navbar-collapse" id="navbar">
                <ul class="nav navbar-nav">
                    <li class="active"><a href="#">首 页</a></li>
                    <li><a href="#">新闻</a></li>
                    <li class="dropdown">
                        <a href="#" class="dropdown-toggle" data-toggle="dropdown">
                            下拉菜单
                            <span class="caret"></span>
                        </a>
                        <ul class="dropdown-menu">
                            <li><a href="#">菜单1</a></li>
                            <li><a href="#">菜单2</a></li>
                            <li><a href="#">菜单3</a></li>
                        </ul>
                    </li>
                </ul>
                <form class="nav navbar-form navbar-right">
                    <div class="form-group">
                        <input type="text" class="form-control" placeholder="用户名">
                    </div>
                    <div class="form-group">
                        <input type="password" class="form-control" placeholder="密码">
                    </div>
                    <div class="form-group">
                        <button type="submit" class="btn btn-primary form-control">提 交</button>
                    </div>
                </form>
            </div>
        </nav>
    </div>
    
    
    <div class="container">
        <div class="page-header">
    
            <h1>Hello,kikay</h1>
    
        </div>
        <div class="col-center-block">
            <!--展示朋友列表-->
    
            <table class="table table-bordered table-striped table-hover table-condensed">
                <thead class="alert-danger">
                    <th>姓名</th>
                    <th>年龄</th>
                </thead>
    
                <tr class="alert-success">
                    <td>Andy</td>
                    <td>60</td>
                </tr>
    
                <tr class="alert-success">
                    <td>Tom</td>
                    <td>29</td>
                </tr>
    
                <tr class="alert-success">
                    <td>小花</td>
                    <td>18</td>
                </tr>
    
            </table>
    
        </div>
    </div>
    <script>
    </script>
    
    
    
    
        <script src="//cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
        <script src="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
        <script src="/static/js/block.js"></script>
    
      </body>
    </html>

    在Flask-Bootstrap中,支持的block样式如下表:

    这里不再一一介绍,在实际应用中可以自己体会。另外上面用到了url_for函数做路由的映射,具体使用可以参见我前面的博客(Flask学习总结笔记(2)– Hello world程序)中关于构造Url的内容。这里引入了js和css文件,对应的文件结构如下:

    关于Flask-Jinja2模板引擎的使用问题就讲到这里,以后在实际使用过程中,再慢慢总结与领会。

    展开全文
  • jinja2了解

    2019-09-23 22:57:23
    文件名template.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body>...table bor...
  • jinja2的安装和使用

    2020-10-13 12:03:28
    1.安装Jinja2 pip install jinja2 2.然后在项目下创建一个py文件 3.在文件中写 from django.contrib.staticfiles.storage import staticfiles_storage from django.urls import reverse from jinja2 import ...
  • jinja2

    千次阅读 2018-05-04 09:54:34
    原文: https://www.cnblogs.com/dachenzi/p/8242713.html模板 要了解jinja2,那么需要先理解模板的概念。模板在Python的web开发中广泛使用,它能够有效的将业务逻辑和页面逻辑分开,使代码可读性增强、并且更加...
  • Python模块学习 - jinja2

    2019-05-02 19:49:41
    要了解jinja2,那么需要先理解模板的概念。模板在Python的web开发中广泛使用,它能够有效的将业务逻辑和页面逻辑分开,使代码可读性增强、并且更加容易理解和维护。 模板简单来说就是一个其中包涵占位变量表示动态...
  • jinja2 简单入门

    千次阅读 2018-10-19 11:47:56
    先创建一个简单的 jinja_demo.py: ...from jinja2 import Environment, FileSystemLoader import os.path # __file__ 就是本文件的名字 # 得到放置模板的目录 path = '{}/templates/'.format(o...
  • jinja2语法

    千次阅读 2018-08-21 17:06:24
    官方文档 本文只是官方文档的部分摘录,只记录了常用语法,和python非常类似,方便快速理解使用 语法 {% ... %} for Statements {{ ... }} for Expressions to print to the template output {# ......# ...
  • jinja2的基本使用

    2020-02-12 13:28:25
    jinja2 jinja2: jinja是日本寺庙的意思, 寺庙的英文是temple和模板的英文template发音类似, jinja2是默认的模仿Django模板的一个模板引擎, 由flask的作者开发 它速度快 被广泛使用, 并且提供了可选的沙箱模板来...
  • 这种错误都是templates文件夹放错位置,应该将此templates文件夹放置在运行程序的文件夹中,就是说templates文件夹和运行文件位于同一级。
  • jinja2.exceptions.TemplateNotFound出错

    万次阅读 2016-08-03 21:27:23
    这种错误都是templates文件夹放错位置,应该将此templates文件夹放置在运行程序的文件夹中,就是说应该包含在内。
  • jinja2.exceptions.UndefinedError: ‘form’ is undefined 创建flask项目使用jinja2的时候出现了如下一样的错误 经过查阅资料发现 原来是两个视图函数引用了同一个模板,模板中使用了jinja2,而引用的视图函数...
  • jinja2 循环列表遍历

    千次阅读 2018-08-19 00:33:25
    http://docs.jinkan.org/docs/jinja2/templates.html#for   {% set v=val %} #设置遍历 注意变量作用域 for循环遍历元素的下标 loop.index {{ "%03d" | format(loop.index0) }} 过滤器及格式化...
  • 後面忘记加括号了
  • Jinja2迭代Python中的list列表和dict字典

    千次阅读 2019-01-04 14:50:51
    经常使用flask的快速搭建效果,总是忘记,记录下 代码示例 # 迭代列表 {% for row in rows %} {{ row }} {% endfor %} # 迭代字典 {% for key, value in row.items() %} {{ key }} {{ value }} ...
  • 我想问问jinja2怎么读

    2015-07-31 07:35:32
    请问各位大神这个模板框架名称怎么读?起这样的名字有什么含义吗?谢谢
  • Window下安装Jinja2

    千次阅读 2017-02-03 21:25:44
    安装之前首先确认已经安装了setuptools或distribute,我选的是后者,  在http://pypi.python.org/pypi/distribute上下载distribute-0.6.49,解压,按照下面的步骤安装:  在cmd中输入如下代码: ...$ cd C:\
  • 一、jinja2模板加载变量的{{ }}和jquery-tmpl插件中的{{ }}相冲突的解决方案。修改jinja2的加载变量的方式:通过 app = Flask(__name__,static_url_path='') 创建的app对象下面添加 app.jinja_env.variable_start_...
1 2 3 4 5 ... 20
收藏数 15,453
精华内容 6,181
关键字:

jinja2