【Flask框架】模板Template

概述:模板就是按照特定规则书写的负责展示效果的HTML文件,模板引擎就是特定规则的解释和替换的工具jinja2;flask的模板引擎使用的就是jinja2的模板引擎,它是由flask核心开发组成员开发。

一、模板

1、工作目录

project/
    manage.py/  项目启动控制文件
    templates/  模板文件的目录

2、渲染模板

方法1:render_template

视图文件

# 视图文件
@app.route('/')
def index():
    return render_template('index.html')

模板文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
hello world!
</div>
</body>
</html>

方法2:render_template_string

# 视图文件
@app.route('/')
def index():
    render_template_string('<p  style="color:blue;font-size:20px">你好,世界!</p>')

使用变量

# 视图函数
@app.route('/')
def index():
    return render_template('index.html', name='marry', age=25)

# 模板渲染
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
 {{ name}}--{{ age}}
</body>
</html>

注意:如果传入的变量不存在,则在模板中插入空白字符。

二、标签

1、作用

  • 在输出中创建文本;
  • 控制逻辑与循环

2、流程控制

(1)if语句

主体结构:

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

实例:

{% if age<=18 %}
    {{ name }}用户为儿童用户
{% elif age<=30 %}
    {{ name }}用户为青年用户
{% elif age<=60 %}
    {{ name }}用户为中年用户
{% else%}
    {{ name }}用户为老年用户
{% endif %}

(2)for循环

实例1:迭代列表

{% for i in myRange %}
    第{{ i }}次迭代<br>
{% else %}
    没有找到该变量<br>
{% endfor %}

实例2:迭代字典

{% for key,value in myInfo.items() %}
    我的{{ key }}是{{ value }},
{% else %}
    没有找到该变量<br>
{% endfor %}

变量:for循环中还包含了一些变量,用来获取当前变量状态。

变量描述
loop.index当前迭代的索引从1开始
loop.index0当前迭代的索引从0开始
loop.first是否为第一次迭代,如果是则返回True
loop.last是否为最后一次迭代,如果是则返回True
loop.length迭代的长度

实例:

{% for item in myRange %}
    {{ loop.index }}--
    {{ loop.index0 }}--
    {{ loop.first }}--
    {{ loop.last }}--
    {{ loop.length }}<br>
{% endfor %}

注意:

  1. for循环搭配else,只有当迭代的变量不存在的时候才会执行else;
  2. 循环不可以使用continue和break来控制循环的执行;

三、注释标签

1、作用

  • 代码调试
  • 说明代码内容

格式:

{# 注释内容  #}

注意:注释的代码不会在浏览器中的html中显示出来

四、文件包含include

1、概述:

include语句可以把一个模板引入到另外一个模板,类似于把一个不安的代码copy到另外一个模板的指定位置中实现模板代码的复用;

2、实例

header.html

<header>我是头部</header>

footer.html

<footer>我是尾部</footer>

test_include.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>test_include</title>
    <style>
        *{
            padding: 0;
            margin: 0;
        }
        header{
            width: 100%;
            height: 40px;
            background-color: #000;
            color: #fff;
        }
        footer{
            width: 100%;
            height: 100px;
            background-color: antiquewhite;
            position: absolute;
            bottom: 0;
        }
    </style>
</head>
<body>
{% include 'common/header.html' %}
<div>我是中间主体部分</div>
{% include 'common/footer.html' %}
</body>
</html>

五、宏macro

1、概述

类似于python中的函数,可以封装一段特殊功能的html代码。

2、使用实例

<body>
{% macro test(name='关羽',age=25) %}
<p>我的名字叫{{ name }},我今年{{ age }}岁了!</p>
{% endmacro %}
{{ test(name='张飞',age=27) }}  # 传参
{{ test() }}  # 使用默认参数
</body>

3、导入宏

宏的导入

{% macro test(name='关羽',age=25) %}
    <p>我的名字叫{{ name }},我今年{{ age }}岁了!</p>
{% endmacro %}

宏的调用

{% from 'common/pubilc_macro.html' import test %}
{{ test() }}

{% from 'common/pubilc_macro.html' import test as t1 %}
{{ t1() }}

{% import 'common/pubilc_macro.html' as t1 %}
{{ t1.test()}}  

六、模板继承

flask中的模板可以继承,通过继承可以把模板中许多重复出现的元素抽取出来,放在父亲模板中,并且父亲模板通过定义block给自模板开一口,自末班根据需要再实现block

关键标签

  • extends:继承
  • block:替换

实例:

视图函数:

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

父模板:base.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{% block title %}父模板{% endblock %}</title>
</head>
<body>
{% block context %}<h2>我是父模板中的内容</h2>{% endblock %}
</body>
</html>

子模板:hello.html

{% extends 'common/base.html' %}
{% block title %}子模板{% endblock %}
{% block context %}
{{ super() }}
我是子模板
{% endblock %}

注意:

  1. 父模板中添加了block,但是在子模板中没有被替换,则正常显示,无任何影响;
  2. 在子模板进行block替换的位置以外的地方添加任何代码都不会被显示出来;
  3. 如果在子模板中进行了父模板中某个block内容的替换,如果想将替换的内容显示出来,则调用变量super()方法;{{  super()  }};
  4. 父模板中如果存在的block越多,那么就证明父模板越灵活。

七、flask-bootstrap扩展库

1、概述

安装

pip install flask-bootstrap

实例化bootstrap对象:

from flask import Flask,redirect,url_for,render_template,render_template_string,request
from flask_script import Manager
from flask_bootstrap import Bootstrap

app = Flask(__name__)
Bootstrap(app=app)  # 实例化bootstrap对象
manager=Manager(app)

查看flask-bootstrap扩展库的base.html

{% block doc -%}
<!DOCTYPE html>
<html{% block html_attribs %}{% endblock html_attribs %}>
{%- block html %}
  <head>
    {%- block head %}
    <title>{% block title %}{{title|default}}{% endblock title %}</title>

    {%- block metas %}
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    {%- endblock metas %}

    {%- block styles %}
    <!-- Bootstrap -->
    <link href="{{bootstrap_find_resource('css/bootstrap.css', cdn='bootstrap')}}" rel="stylesheet">
    {%- endblock styles %}
    {%- endblock head %}
  </head>
  <body{% block body_attribs %}{% endblock body_attribs %}>
    {% block body -%}
    {% block navbar %}
    {%- endblock navbar %}
    {% block content -%}
    {%- endblock content %}

    {% block scripts %}
    <script src="{{bootstrap_find_resource('jquery.js', cdn='jquery')}}"></script>
    <script src="{{bootstrap_find_resource('js/bootstrap.js', cdn='bootstrap')}}"></script>
    {%- endblock scripts %}
    {%- endblock body %}
  </body>
{%- endblock html %}
</html>
{% endblock doc -%}

继承bootstrap库中的base.html,并替换部分内容

{% extends 'bootstrap/base.html' %}
{% block title %}我是bootstrap替换后的标题{% endblock %}
{% block content %}我是bootstrap替换后的导航栏{% endblock %}

bootstrap库中所有block的作用

block

说明
doc整个HTML文档
htmlHTML内部所有代码
headhead标签
titletitle标签
style引入css样式
metas一组meta标签
bodybody标签
navbar用户自定义导航条
content用户自定义内容
scripts用户自定义js脚本

路由和视图函数

@app.route('/')
def hello():
    return render_template('common/bootstrap_base.html')

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值