1. 程式人生 > >Flask08 包含(include)、繼承(extends)、宏???、模板中變量的來源

Flask08 包含(include)、繼承(extends)、宏???、模板中變量的來源

自己 weight es2017 static out btn query range turn

1 包含

  直接把另一個文件的內容,復制粘貼過來

  {% include "模板路徑" %}

    註意:模板都是放在 templates 這個文件夾下面的,可以在裏面新建文件夾來進行分離;

    例如:{% include "include/header.html" %}

  技術分享

技術分享
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>測試頁面</title>
</head>
<body>
header模板 技術分享
</body>
</html>
footer模板 技術分享
<div>
    <h2>這是測試包含時的內容</h2>
</div>
content模板 技術分享
{% include "include/header.html" %}

{% include "include/content.html" %}

{% include "include/footer.html" %}
整合模板 技術分享
from flask import Blueprint
from flask import render_template

bp_test = Blueprint(‘test‘, __name__)

@bp_test.route(‘/test/‘)
def bpTest():
    return ‘test 頁面‘

@bp_test.route(‘/include/‘)
def bpInclude():
    return render_template(‘include/test.html‘)
藍圖代碼 技術分享
from flask import Flask
from flask import url_for

from bp_include import bp_test
# from bp_extends import bp_extends

app = Flask(__name__)

app.register_blueprint(bp_test)
# app.register_blueprint(bp_extends)


@app.route(/)
def hello_world():
    return Hello World!

print(app.url_map)

if __name__ == __main__: app.run(debug=True)
python代碼

2 繼承

  跟java裏面的繼承很像;但是可以在模板中挖坑,在子模板中填坑;也可以在子模板中進行挖坑

  2.1 繼承格式

    {% extends “模板路徑” %}

      註意:繼承語句只能寫在模板的開始位置,而且寫了繼承語句的模板只能進行填坑或者挖坑操作

  2.2 填坑和挖坑的格式

    {% block 坑名 %}

    {% endblock 坑名 %}

  2.3 小技巧

    如果要局部修改,在坑裏面再挖坑

    如果要保留負模版坑的內容,又加點新東西使用 {{ super() }},在寫上需要添加的東西

3 構建自己的網頁結構

  利用 bootstrap 構建自己的網頁結構

  3.1 下載 bootstrap 相關文件

    bootstrap中文官網:點擊前往

    技術分享

  3.2 下載 bootstrap 的依賴框架

    jquery官網:點擊前往

    技術分享

  3.3 將下載到的bootstrap文件和jquery文件全部拷貝到static文件中

    技術分享

    技術分享

  3.4 創建一個html模板 base.html 作為基礎模板

    base.html 文件的作用:引入所有需要用到的公共的靜態文件

技術分享
<!DOCTYPE html>
{# base.html 文件的作用:引入所有需要用到的公共的靜態文件 #}
<html lang="en">
<head>
    {% block head %}
        <meta charset="UTF-8">

        <title>
            {% block title %}
                base模板
            {% endblock title %}
        </title>

        <script src="{{ url_for(‘static‘, filename=‘js/jquery-3.2.1.js‘) }}"></script>
        <script src="{{ url_for(‘static‘, filename=‘js/bootstrap.js‘) }}"></script>
        <link rel="stylesheet" href="{{ url_for(‘static‘, filename=‘css/bootstrap.css‘) }}" />
    {% endblock head %}
</head>
<body>
    {% block body %}
        這是base模板的body
    {% endblock body %}
</body>
</html>
base.html

  註意:<script src="{{ url_for(‘static‘, filename=‘js/jquery-3.2.1.js‘) }}"></script>

    能夠在模板中使用 url_for 方法的原理是flask已經對 Jinja2 模板進行了一些初始化配置

  3.5 根據 base.html 創建一個網頁布局模板 layout.html

技術分享
{% extends "extends/base.html" %}
{# 繼承只能繼承一個,而且必須寫在最前面;但是可以在父模板挖坑,也可以在子模板中填坑和挖坑;
    註意:填坑和挖坑的語法都是一樣的
#}

{% block title %}
    layout模板
{% endblock %}

{% block head %}
    {{ super() }}
    <link rel="stylesheet" href="{{ url_for(‘static‘, filename=‘css/layout.css‘) }}" />

{% endblock %}

{% block body %}
    layout模板的body
    <div id="nav">
        這是導航條
    </div>
    <div id="content">
        {% block content %}
            這是內容
        {% endblock content %}
    </div>
    <div id="footer">
        這是頁腳
    </div>
{% endblock body %}
layout.html

  3.6 根據 layout.html 創建一個頁面 index.html 

技術分享
{% extends "extends/layout.html" %}

{% block title %}
    首頁
{% endblock %}

{% block head %}
    {{ super() }}
    <link rel="stylesheet" href="{{ url_for(‘static‘, filename=‘css/index.css‘) }}" />
{% endblock %}

{% block content %}
    <ul>
    {% for name in ["warrior", "fury", "zeus"] %}
        <li>
            {{ name }}
        </li>
    {% endfor %}
    </ul>
    <hr />
    <button class="btn btn btn-default">點擊</button>
    <hr />
    <ul class="nav nav-tabs">
      <li role="presentation" class="active"><a href="#">Home</a></li>
      <li role="presentation"><a href="#">Profile</a></li>
      <li role="presentation"><a href="#">Messages</a></li>
    </ul>
{% endblock content %}
index.html

  3.7 使用自己寫的頁面 index.html

技術分享
from flask import Blueprint
from flask import render_template

bp_extends = Blueprint(extends, __name__, url_prefix=/extends)

@bp_extends.route(/base/)
def ex_base():
    return render_template(extends/base.html)

@bp_extends.route(/layout/)
def ex_layout():
    return render_template(extends/layout.html)

@bp_extends.route(/index/)
def ex_index():
    return render_template(extends/index.html)
藍圖代碼 技術分享
from flask import Flask
from flask import url_for

# from bp_include import bp_test
from bp_extends import bp_extends

app = Flask(__name__)

# app.register_blueprint(bp_test)
app.register_blueprint(bp_extends)


@app.route(/)
def hello_world():
    return Hello World!

print(app.url_map)

if __name__ == __main__:
    app.run(debug=True)
python代碼

  3.8 項目文件圖

    技術分享

4 宏

  待更新...

5 模板中變量的來源

  flask的全局變量

  Flask對象的上下文處理器

  藍圖的上下文處理器

  Jinja2的全局函數

  自己設置的變量

技術分享
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>測試模板</title>
</head>
<body>
    <h2>這裏是測試模板的內容</h2>
    <hr />

    <h4>range函數</h4>
    {% for foo in range(10) %}
        <li>{{ foo }}</li>
    {% endfor %}
    <hr />

    <h4>自動填充函數</h4>
    {{ lipsum(n=3, html=true, min=20, max=100) }}
    <hr />

    <h4>cycler函數</h4>
    <p>
        {% set row_class = cycler("warrior", "fury", "zeus") %}
        {{ row_class.next() }}
{#        輸出當前值,指向下一個#}
        <br />
        {{ row_class.current }}
{#        輸出當前值,指向不變#}
        <br />
        {{ row_class.reset() }}
{#        輸出None,指向第一個#}
        <br />
        {{ row_class.current }}
    </p>

</body>
</html>
html模板 技術分享
from flask import Blueprint
from flask import render_template

bp_test = Blueprint(test, __name__, url_prefix=/test)

@bp_test.route(/test/)
def test():
    return render_template(test.html)
藍圖代碼 技術分享
from flask import Flask
from flask import url_for

# from bp_include import bp_test
# from bp_extends import bp_extends
from bp_test import bp_test

app = Flask(__name__)

# app.register_blueprint(bp_test)
# app.register_blueprint(bp_extends)
app.register_blueprint(bp_test)


@app.route(/)
def hello_world():
    return Hello World!

print(app.url_map)

if __name__ == __main__:
    app.run(debug=True)
python代碼

Flask08 包含(include)、繼承(extends)、宏???、模板中變量的來源