美文网首页我爱编程
(二) flask的模板引擎

(二) flask的模板引擎

作者: fanhang64 | 来源:发表于2018-03-20 20:52 被阅读160次

模板引擎

概念: 模板引擎就是一个按照一定的语法格式, 使用视图的参数进行替换的一个过程

jinjia2模板引擎

是由flask开发组人员开发的,

一. jinjia2的使用

(1) 准备templates目录

目录结构为:

project
    manage.py
    templates/
        app/
            index.html
(2) 准备模板文件

在templates下新建一个index.html

<h2>{{hello}}</h2>

模板中使用变量:

  1. 视图传递给模板的数据
  2. 遵循标识符的命名规则
  3. 语法是{{关键字参数的名称}}
  4. 如果当前变量不存在, 则插入的是空字符串(不报错)
(3) 视图函数
@app.route('/')
def index():
    return render_template('index.html', hello='hello')
(4) 视图 返回模板
  1. render_template('文件名.html', 关键字参数=值..)

    def test():
        g.name = "张三"  # 使用变量g传递参数
        g.age = 18
        render_template('index.html', hello='hello')  # 使用关键字传递参数
        # 如果模板文件存在文件夹嵌套
        return render_template('app/hello.html')
    
  2. render_template_string()

    render_template_string('<h1 style="color:red;">{{name}}</h1>', name='李四')  # 简短模板返回
    

二. 模板中常用的函数

函数名 函数说明
upper 全部大写
lower 全部小写
title 每个单词的首字母大写
capitalize 首字母大写
trim 去掉两侧空白
striptags 去掉HTML标签
safe 原样显示HTML标签, 不转义

格式: {{g.name|upper}} {{g.name|first}}

三. 标签

格式:

{% if 条件%}
    ..
{% elif %}
    ..
{% else %}
    ..
{% endif %}

常用运算符:

==,>=,<=,!=,>,<,and,or,in,not in

注意:

在django里运算符两侧需要存在空格, 在flask里不需要, 推荐两侧添加空格

实例:

{% if var2 == 'abcd' %}  # 都采用这中方式
    <h2>相等</h2>
{% endif %}

(2) 循环

格式为:

{% for i in 变量名 %}
    ..
{% else %}  # 变量不存在时,走else 
    ..
{% endfor %}s

实例:

{% for i in range(10) %}
    <li>{{ i }}</li>
{% endfor %}

四. 注释

格式:

{# 单行和多行的注释  #}

五. 文件包含

格式:

{% include '文件名.html'%}

用法:

一般会将一个网站的公共部分的页面导入进来, 减少代码的冗余和后期代码的维护

实例:

{% include 'nav.html' %}
{% include 'app/hello.html' %}

六. 宏的使用

概述: 采用类似于Python的函数的形式, 进行定义和调用, 通常把特定功能的显示定义成一个宏, 哪里使用, 就在哪里调用, 避免代码冗余

宏的定义:

{% macro 宏的名字(形参名='形参默认值') %}
    内容
{% endmacro %}

宏的调用:

{{ 宏的名字(实参) }}

实例:

{% macro  show_name(name='李四') %}  # 形参且有默认值
{% macro  show_name(name) %}  # 没有默认值, 实参可传可不传
    <h2>{{ name }}</h2>
{% endmacro %}
# 调用
{{ show_name('张三') }}
{{ show_name() }}  # ok 如果有形参(不含形参默认值时),不传参不会保错
{{ show_name('张三', '李四') }} # error 传递多个参数会报错
{{ show_name(var) }}  # ok 接收视图传递的数据

宏的导入:

from 'nav.html' import show_name

实例:

{#{% from 'forms.html' import input %}#}
{% from 'forms.html' import input,textarea %}   # 导入多个宏
{% from 'forms.html' import input as input_field %}  # 导入同时起别名
<form action="">
    <dl>
        <dt>用户名</dt>
     {# <dd>{{ input('username') }}</dd>#}
        <dd>{{ input_filed('username') }}</dd>
        <dt>密码</dt>
        <dd>{{ input('userpass','password') }}</dd>
        <dt>确认密码</dt>
        <dd>{{ input(name='repass',type='password') }}</dd>
        <dt>个人信息</dt>
        <dd>{{ textarea('userinfo') }}</dd>
    </dl>
</form>
{% import 'forms.html' as forms %}   # 导入同时起别名
<form action="">
    <dl>
        <dt>用户名</dt>
        <dd>{{ forms.input('username') }}</dd>
        <dt>密码</dt>
        <dd>{{ forms.input('userpass','password') }}</dd>
        <dt>确认密码</dt>
        <dd>{{ forms.input(name='repass',type='password') }}</dd>
        <dt>个人信息</dt>
        <dd>{{ forms.textarea('userinfo') }}</dd>
    </dl>
</form>

注意:

只能在宏的定义的下方去调用

七. 模板的继承

flask通过模板的继承将许多重复的元素抽取出来, 放在base(parents)模板中, 通过block给子模板提供替换的位置

定义base.html基础模板

<!DOCTYPE html>
<html lang="en">
<head>
    {% block head %}
        <meta charset="UTF-8">
        <title>{% block title %}title{% endblock %}</title>
        {% block css %}
            <link rel="stylesheet" href="xxx.css">
        {% endblock %}
        {% block script %}
        {% endblock %}
    {% endblock %}
</head>
<body>
{% block nav %}
    {% include 'nav.html' %}
{% endblock %}
<div class="content">
    {% block content %}
        <h2>我是base页面的content默认内容</h2>
    {% endblock %}
</div>
{% block footer %}
    {% include 'footer.html' %}
{% endblock %}
</body>
</html>

子模板index.html

{% extends 'base.html' %}
{% block title %}
    我是首页
{% endblock %}
{% block css %}
    {{ super() }}              # 调用父html样式
    <style type="text/css">
        li{ width: 200px; height: 100px; color: red; }
    </style>
{% endblock %}
{% block content %}
    <ul>
        <li>内容1</li>
        <li>内容2</li>
        <li>内容3</li>
    </ul>
{% endblock %}

模板的继承

{%extends '文件名.html'%}

注意:

  • 调用block内的原来的内容 使用{{ super() }}

八. flask-bootstrap

(1) 安装
pip install flask-bootstrap
(2) 使用
from flask_bootstrap import Bootstrap  # 导入
bootstarp = Bootstrap(app)  # 实例化对象
(3) 创建base页面
{% extends 'bootstrap/base.html' %}
{% block content %}
    首页
{% endblock %}
(4) bootstrap/base.html常用的block说明
block标签 说明
doc 整个HTML文档
HTML HTML的整个标签
head 替换head标签
title title标题
styles 引入css
metas 一组meta标签
body 整个body体
navbar 导航条
content 主体内容
scripts 导入js

注意: 如果继承了bootstrap/base.html 替换之后没有任何样式, 查看是否调用了super()

(5) 自定义bootstrap的base页面

base.html页面

{% extends 'bootstrap/base.html' %}
{% block navbar %}
    <nav class="navbar navbar-inverse" style="border-radius: 0px;">
        <div class="container">
            <!-- Brand and toggle get grouped for better mobile display -->
            <div class="navbar-header">
                <button type="button" class="navbar-toggle collapsed" data-toggle="collapse"
                        data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
                    <span class="sr-only">Toggle navigation</span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </button>
                <a class="navbar-brand" href="#"><span class="glyphicon glyphicon-glass" aria-hidden="true"></span></a>
            </div>

            <!-- Collect the nav links, forms, and other content for toggling -->
            <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
                <ul class="nav navbar-nav">
                    <li class="active"><a href="#">首页 <span class="sr-only">(current)</span></a></li>
                    <li><a href="#">个人中心</a></li>
                    <li><a href="#">我的</a></li>
                    <li><a href="#">你的</a></li>
                </ul>
                <ul class="nav navbar-nav navbar-right">
                    <li><a href="#">登录</a></li>
                    <li><a href="#">注册</a></li>

                </ul>
            </div><!-- /.navbar-collapse -->
        </div><!-- /.container-fluid -->
    </nav>
{% endblock %}
{% block content %}
    <div class="container">
    {% block tcontent %}
   
    {% endblock %}
    </div>
{% endblock %}
(6) 自定义错误页面
{% extends 'boot_base.html' %}
{% block title %}
    {{ title }}
{% endblock %}
{% block tcontent %}
    <div class="alert alert-danger" role="alert">{{ info }}</div>
{% endblock %}

处理错误的视图

@app.errorhandler(404)
def page_not_found(e):
    return render_template('error.html',title='404NOTFOUND', info=e)
@app.errorhandler(500)
def page_not_found(e):
    return render_template('error.html',title='500ERROR', info=e)

九. url_for()

1. 根据视图函数名, 反向构造路由地址, 参数为get传参
return url_for('index', name='zs',age=18)
2. 构造完整的url地址
 return url_for('index', name='zs',age=18, _external=True)  # _external=True构造完整的url地址
3. 在模板中使用url_for()
<p><a href="{{ url_for('index') }}">回到首页</a></p>

十. 视图传递多个参数

(1) 使用全局变量g
def index(): 
    g.name='zs'
    g.age= 18
    return render_template('boot_index.html')

在模板中使用:

{{g.name}}
{{g.age}}
(2) 使用**locals()
def index():
    a = 1
    b = 2
    return render_template('boot_index.html', **locals())
(3) 将字典变成关键字参数
def index():
     return render_template('boot_index.html', **{'a':1, 'b':2})
(4) 元素传参
def index():
    return render_template('boot_index.html', a=1, b=2)

十一. 加载静态资源

(1) 目录结构
project/
    templates/
    static/
        link.css
        1.jpg
    manage.py
(2) 在模板中加载静态资源
<img src="{{ url_for('static', filename='1.jpg' ) }}" alt="">
(3) 如果文件外层有目录嵌套, 则在filename前添加路径
<img src="{{ url_for('static', filename='img/1.jpg' ) }}" alt="">
(4) 修改默认静态资源文件夹的名称
app = Flask(__name__, static_folder='static', template_folder='templates') # 修改静态文件夹名和模板名

相关文章

  • flask-模板

    一、模板的定义 二、模板引擎 flask使用jinja2作为默认模板引擎 2-1:默认配置 template_fo...

  • templates(模板)

    jinja2 Flask中使用jinja2模板引擎jinja2是由Flask作者开发,模仿Django的模板引擎 ...

  • (二) flask的模板引擎

    模板引擎 概念: 模板引擎就是一个按照一定的语法格式, 使用视图的参数进行替换的一个过程 jinjia2模板引擎 ...

  • jinja2

    jinja2是Flask作者开发的一个模板系统,起初是仿django模板的一个模板引擎,为Flask提供模板支持,...

  • flask.pocoo.org/docs/0.12/templa

    原文链接 模板 Flask 使用 Jinja2 作为默认模板引擎。你完全可以使用其它模板引擎。但是不管你使用 哪种...

  • Flask模板引擎:Jinja2常用语法整理

    摘要:Flask,Jinja2,HTML Flask模板引擎Jinja2简述 模板实质上是一个静态的包含HTML语...

  • Flask学习笔记-依赖库

    Flask依赖两个外部库: Jinja2模板引擎 Werkzeng WSGI工具集。 使用pip安装flask的时...

  • Flask基础01

    Flask框架 Flask 是一个基于python并且依赖于Jinja2模板引擎和 Werkzeug WSGI 服...

  • Templates 2018-08-28

    1. jinja2 Flask中使用jinja2模板引擎 jinja2是由Flask作者开发,模仿Django的模...

  • flask中模板的使用

    手动拼接html文件是一件非常痛苦的事,flask内置了jinja2的模板引擎,通过此模板引擎,可以比较轻松完成h...

网友评论

    本文标题:(二) flask的模板引擎

    本文链接:https://www.haomeiwen.com/subject/bfkiqftx.html