Jinja2模板

Jinja2模板传参

  1. 如何渲染模板:

    • 模板放在templates文件夹下
    • flask中导入render_template函数。
    • 在视图函数中,使用render_template函数,渲染模板。注意:只需要填写模板的名字,不需要填写templates这个文件夹的路径。
  2. 模板传参:
    • 如果只有一个或者少量参数,直接在render_template函数中添加关键字参数就可以了。
    • 如果有多个参数的时候,那么可以先把所有的参数放在字典中,然后在render_template中,
      使用两个星号,把字典转换成关键参数传递进去,这样的代码更方便管理和使用。
  3. 在模板中,如果要使用一个变量,语法是:{{params}}
  4. 访问模型中的属性或者是字典,可以通过{{params.property}}的形式,或者是使用{{params['age']}}.

示例代码

06template01 .py

#encoding: utf-8
from flask import Flask,render_template

app = Flask(__name__)

@app.route('/')
def index():
    # 类
    class Person(object):
        name = u'p17bdw'
        age = 18

    p = Person()

    context = {
        'username': u'c17bdw',
        'gender': u'男',
        'age': 17,
        'person': p,    # 声明
        'websites': {
            'baidu': 'www.baidu.com',
            'google': 'www.google.com'
        }
    }
    return render_template('anthoer/index.html',**context)

if __name__ == '__main__':
    app.run(debug=True)

anthoer/index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    这是HTML文件中出现的文字
    <p>用户名:{{ username }}</p>
    <p>性别:{{ gender }}</p>
    <p>年龄:{{ age }}</p>

    <hr>
    <p>名字:{{ person['name'] }}</p>
    <p>年龄:{{ person.age }}</p>

    <hr>
    <p>百度:{{ websites['baidu'] }}</p>
    <p>谷歌:{{ websites['google'] }}</p>
</body>
</html>

if判断

  1. 语法:
    {% if xxx %} {% else %} {% endif %}

  2. if的使用,可以和python中相差无几。

示例代码

07if_statement .py

# 输入 http://127.0.0.1:5000/1/ 为登录状态,否则为未登录状态。

#encoding: utf-8

from flask import Flask,render_template

app = Flask(__name__)

@app.route('/<is_login>/')
def index(is_login):
    if is_login == '1':
        user = {
            'username': u'17bdw',
            'age':20
        }
        return render_template('index.html',user=user)
    else:
        return render_template('index.html')

if __name__ == '__main__':
    app.run(debug=True)

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    {% if user and user.age > 18 %}
        <a href="#">{{ user.username }}</a>
        <a href="#">注销</a>
    {% else %}
        <a href="#">登录</a>
        <a href="#">注册</a>
    {% endif %}
</body>
</html>

for循环遍历列表和字典

  1. 字典的遍历,语法和python一样,可以使用items()keys()values()iteritems()iterkeys()itervalues()
    {% for k,v in user.items() %} <p>{{ k }}:{{ v }}</p> {% endfor %}
  2. 列表的遍历:语法和python一样。
    {% for website in websites %} <p>{{ website }}</p> {% endfor %}

示例代码

08for_statement .py

#encoding: utf-8

from flask import Flask,render_template

app = Flask(__name__)

# for遍历字典

@app.route('/')
def index():
    books = [
        {
            'name': u'西游记',
            'author': u'吴承恩',
            'price': 109
        },
        {
            'name': u'红楼梦',
            'author': u'曹雪芹',
            'price': 200
        },
        {
            'name': u'三国演义',
            'author': u'罗贯中',
            'price': 120
        },
        {
            'name': u'水浒传',
            'author': u'施耐庵',
            'price': 130
        }
    ]
    return render_template('index.html',books=books)

if __name__ == '__main__':
    app.run(debug=True)

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<table>
    <thead>
        <th>书名</th>
        <th>作者</th>
        <th>价格</th>
    </thead>
    <tbody>
        {% for book in books %}
            <tr>
                <td>{{ book.name }}</td>
                <td>{{ book.author }}</td>
                <td>{{ book.price }}</td>
            </tr>
        {% endfor %}
    </tbody>
</table>

</body>
</html>

过滤器

  1. 介绍和语法:

    • 介绍:过滤器可以处理变量,把原始的变量经过处理后再展示出来。作用的对象是变量。
    • 语法:
      {{ avatar|default('xxx') }}
  2. default过滤器:如果当前变量不存在,这时候可以指定默认值。
  3. length过滤器:求列表或者字符串或者字典或者元组的长度。
  4. 常用的过滤器:
    abs(value):返回一个数值的绝对值。示例:-1|abs
    default(value,default_value,boolean=false):如果当前变量没有值,则会使用参数中的值来代替。示例:name|default('xiaotuo')——如果name不存在,则会使用xiaotuo来替代。boolean=False默认是在只有这个变量为undefined的时候才会使用default中的值,如果想使用python的形式判断是否为false,则可以传递boolean=true。也可以使用or来替换。
    escape(value)或e:转义字符,会将<、>等符号转义成HTML中的符号。示例:content|escape或content|e。
    first(value):返回一个序列的第一个元素。示例:names|first
    format(value,*arags,**kwargs):格式化字符串。比如:

    {{ "%s" - "%s"|format('Hello?',"Foo!") }}
    将输出:Helloo? - Foo!
    last(value):返回一个序列的最后一个元素。示例:names|last。

    length(value):返回一个序列或者字典的长度。示例:names|length。
    join(value,d=u''):将一个序列用d这个参数的值拼接成字符串。
    safe(value):如果开启了全局转义,那么safe过滤器会将变量关掉转义。示例:content_html|safe。
    int(value):将值转换为int类型。
    float(value):将值转换为float类型。
    lower(value):将字符串转换为小写。
    upper(value):将字符串转换为小写。
    replace(value,old,new): 替换将old替换为new的字符串。
    truncate(value,length=255,killwords=False):截取length长度的字符串。
    striptags(value):删除字符串中所有的HTML标签,如果出现多个空格,将替换成一个空格。
    trim:截取字符串前面和后面的空白字符。
    string(value):将变量转换成字符串。
    wordcount(s):计算一个长字符串中单词的个数。

示例代码

09filter_demo .py

#encoding: utf-8

from flask import Flask,render_template

app = Flask(__name__)

@app.route('/')
def index():
    comments = [
        {
            'user': u'admin',
            'content': 'xxxx'
        },
        {
            'user': u'tesr',
            'content': 'xxxx'
        }
    ]
    return render_template('index.html',comments=comments)

if __name__ == '__main__':
    app.run(debug=True)

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>过滤器</title>
</head>
<body>

# 如果avatar这个变量不存在,就使用default过滤器提供的值

<img src="{{ avatar|default('http://avatar.csdn.net/1/D/B/3_hmzkekek41.jpg') }}" alt="">

<hr>

# length 计算长度
<p>评论数:({{ comments|length }})</p>
<ul>
    {% for comment in comments %}
        <li>
            <a href="#">{{ comment.user }}</a>
            <p>{{ comment.content }}</p>
        </li>
    {% endfor %}

</ul>
</body>
</html>

继承和block

  1. 继承作用和语法:

    • 作用:可以把一些公共的代码放在父模板中,避免每个模板写同样的代码。
    • 语法:
      {% extends 'base.html' %}
  2. block实现:
    • 作用:可以让子模板实现一些自己的需求。父模板需要提前定义好。
    • 注意点:字模板中的代码,必须放在block块中。

示例代码

app.py

#encoding: utf-8

from flask import Flask,render_template

app = Flask(__name__)

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/login/')
def login():
    return render_template('login.html')

if __name__ == '__main__':
    app.run(debug=True)

index.html

# 基础页面
{% extends 'base.html' %}

{% block head %}
    <style>

    </style>
    <link rel="stylesheet" href="">
    <script></script>
{% endblock %}

{% block title %}
    首页
{% endblock %}

{% block main %}
    <h1>这是首页</h1>
{% endblock %}

base.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{% block title %}{% endblock %}</title>
        <style>
        .nav{
            background: #3a3a3a;
            height: 65px;
        }
        ul{
            overflow: hidden;
        }
        ul li{
            float: left;
            list-style: none;
            padding: 0 10px;
            line-height: 65px;
        }
        ul li a{
            color: #fff;
        }
    </style>
    {% block head %}{% endblock %}
</head>
<body>
<div class="nav">
    <ul>
        <li><a href="/">首页</a></li>
        <li><a href="/login">发布问答</a></li>
    </ul>
</div>
{% block main %}{% endblock %}
</body>
</html>

login.html

{% extends 'base.html' %}

{% block title %}
    登录
{% endblock %}

{% block main %}
    <h1>这是登录页面</h1>
{% endblock %}

url链接

使用url_for(视图函数名称)可以反转成url。

加载静态文件

  1. 语法:url_for('static',filename='路径')
  2. 静态文件,flask会从static文件夹中开始寻找,所以不需要再写static这个路径了。
  3. 可以加载css文件,可以加载js文件,还有image文件。
    第一个:加载css文件 <link rel="stylesheet" href="{{ url_for('static',filename='css/index.css') }}"> 第二个:加载js文件 <script src="{{ url_for('static',filename='js/index.js') }}"></script> 第三个:加载图片文件 <img src="{{ url_for('static',filename='images/zhiliao.png') }}" alt="">

【Python】Flask系列-模板笔记的更多相关文章

  1. 知了课堂 Python Flask零基础 笔记整理

    目录 起步 安装Python2.7: Python虚拟环境介绍与安装: pip安装flask: 认识url: URL详解 web服务器和应用服务器以及web应用框架: Flask 第一个flask程序 ...

  2. 【Python】Flask系列-数据库笔记

    MySQL-python中间件的介绍与安装: 1.如果是在类unix系统上,直接进入虚拟环境,输入sudo pip install mysql-python. 2.如果是在windows系统上,那么在 ...

  3. Python Flask Jinja2模板引擎

    模板 简介 模板是一个包含响应文本的文件,其中包含用占位变量表示的动态部分,其具体值只在请 求的上下文中才能知道. 渲染 使用真实值替换变量,再返回最终得到的响应字符串,这一过程 称为渲染.为了渲染模 ...

  4. [python][flask] Jinja 模板入门

    Flask 和 Django 附带了强大的 Jinja 模板语言. 对于之前没有接触过模板语言的人来说,这类语言基本上就是包含一些变量,当准备渲染呈现 HTML 时,它们会被实际的值替换. 这些变量放 ...

  5. Python——Flask框架——模板

    一.渲染模板 render_template 函数把Jinja2模板引擎集成到程序中 二.Jinja2变量过滤器 过滤器名 说明 safe 渲染值是不转义 capitalize 把值得首字母转换成大写 ...

  6. Python FLask Web 学习笔记:jinjia2的使用方法1

    # coding:utf-8 from jinja2 import Template x = """ <p>大爷的孙子</p> <ul> ...

  7. Python Flask 开发学习笔记

    Flask学习 安装pipenv虚拟环境 pip Install pipenv 运行pipenv pipenv --version 进入虚拟容器 pipenv install 安装flask pipe ...

  8. 【Python】Flask系列-URL和视图笔记

    1.学习目标 熟悉Flask相关知识. 熟悉web开发流程. 能独立开发Flask项目. 2.环境配置 Python虚拟环境安装 因为python的框架更新迭代太快了,有时候需要在电脑上存在一个框架的 ...

  9. [python][flask] Flask 图片上传与下载例子(支持漂亮的拖拽上传)

    目录 1.效果预览 2.新增逻辑概览 3.tuchuang.py 逻辑介绍 3.1 图片上传 3.2 图片合法检查 3.3 图片下载 4.__init__.py 逻辑介绍 5.upload.html ...

随机推荐

  1. Alpha版总结会议——班级派

    一.开会的过程 在周一下午上课的最后20分钟内,我们组进行了“班级派”的alpha版的总结会议.首先进行的是分析目前的版本情况,每个人说了自己的进度,包括已经完成的以及即将要完成的.随后是分析前段时间 ...

  2. Maven 学习笔记——Maven和Eclipse(2)

    前面已经配置好Maven的环境和本地仓库已经准备好了,下面我们通过Eclipse创建Maven项目. 1.安装Maven集成于Eclipse IDE (Eclipse的版本中如果已经集成了Maven插 ...

  3. Jmeter当获取正则表达式匹配数字为负数时获取所有匹配的值

    需求说明:如果http的bodyData中有类似于{"idList":["6505","6506","2222".... ...

  4. Vue项目框架

    Vue项目框架 基本组件的使用: new Vue({ el, //要绑定的DOM element data, //要绑定的资料 props, //可用来接收父原件资料的属性 template, //要 ...

  5. 导入appiumlibrary显红

    1.点击ride中的Tools的View RIDE Log 2.打开日志报如下错误,提示没有six这个模块,可能是最新包的要对python版本兼容 3.所以使用pip install six安装包后 ...

  6. SpringMVC返回JSON方案

    SpringMVC已经大行其道.一般的,都是返回JSP视图.如果需要返回JSON格式,我们大都掌握了一些方法. 在ContentNegotiatingViewResolver之前,一般使用XmlVie ...

  7. POJ 1182 食物链 (拆点并查集)

    食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 78601   Accepted: 23422 Description ...

  8. 洛谷P3960 列队(NOIP2017)(Splay)

    洛谷题目传送门 最弱的Splay...... 暴力模拟30分(NOIP2017实际得分,因为那时连Splay都不会)...... 发现只是一个点从序列里搬到了另一个位置,其它点的相对位置都没变,可以想 ...

  9. 【BZOJ1005】[HNOI2008]明明的烦恼(prufer序列)

    [BZOJ1005][HNOI2008]明明的烦恼(prufer序列) 题面 BZOJ 洛谷 题解 戳这里 #include<iostream> #include<cstdio> ...

  10. 个推数据统计产品(个数)iOS集成实践

    最近业务方给我们部门提了新的需求,希望能一站式统计APP的几项重要数据.这次我们尝试使用的是个推(之前专门做消息推送的)旗下新推出的产品“个数·应用统计”,根据官方的说法,个推的数据统计产品通过专业的 ...