使用Flask-Bootstrap集成Bootstrap

环境配置

Bootstrap是Twitter开发的一个开源Web框架,它提供的用户界面组件可用于创建整洁且具有吸引力的网页,而且兼容所有现代的桌面和移动平台Web浏览器。

Bootstrap是客户端框架,因此不会直接涉及服务器。服务器需要做的只是提供引用了Bootstrap层叠样式表(CSS, cascading style sheet)和JavaScript文件的HTML响应,并在HTML、CSS和JavaScript代码中实例化所需的用户界面元素。这些操作最理想的执行场所就是模板。

要想在应用中集成Bootstrap,最直接的方法是根据Bootstrap文档中的说明对HTML模板进行必要的改动。不过,这个任务使用Flask扩展处理要简单得多,而且相关的改动不会导致主逻辑凌乱不堪。

我们要使用的扩展是Flask-Bootstrap,它可以使用pip安装:

(venv) $ pip install flask-bootstrap

Flask扩展在创建应用实例时初始化。示例3-4是Flask-Bootstrap的初始化方式。

示例 hello.py:初始化Flask-Bootstrap

from flask bootstrap import Bootstrap
# ...
bootstrap = Bootstrap(app)

扩展

扩展通常从flask 包中导入,其中是扩展的名称。多数Flask扩展采用两种初始化方式中的一种。在示例3-4中,初始化扩展的方式是把应用实例作为参数传给构造函数。第7章将介绍大型应用初始化扩展的一种高级方式。

初始化Flask-Bootstrap之后,就可以在应用中使用一个包含所有Bootstrap文件和一般结构的基模板。应用利用Jinja2的模板继承机制来扩展这个基模板。示例3-5是把user.html改写为衍生模板后的新版本。

示例 templates/user.html:使用Flask-Bootstrap的模板

{% extends "bootstrap/base.html" %}


{% block title %}Flasky{% endblock %}


{% block navbar %}
<div class="navbar navbar-inverse" role="navigation">
    <div class="container">
      <div class="navbar-header">
          <button type="button" class="navbar-toggle"
            data-toggle="collapse" data-target=".navbar-collapse">
              <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=" ">Flasky</ a>
/div>
      <div class="navbar-collapse collapse">
          <ul class="nav navbar-nav">
              <li>< a href=" ">Home</ a></li>
          </ul>
      </div>
    </div>
</div>
{% endblock %}


{% block content %}
<div class="container">
    <div class="page-header">
      <h1>Hello, {{ name }}! </h1>
    </div>
</div>
{% endblock %}

Jinja2中的extends指令从Flask-Bootstrap中导入bootstrap/base.html,从而实现模板继承。Flask-Bootstrap的基模板提供了一个网页骨架,引入了Bootstrap的所有CSS和JavaScript文件。

上面这个user.html模板定义了3个区块,分别名为title、navbar和content。这些区块都是基模板提供的,可在衍生模板中重新定义。title区块的作用很明显,其中的内容会出现在渲染后的HTML文档头部,放在

标签中。<br> navbar和content这两个区块分别表示页面中的导航栏和主体内容。<br> 在这个模板中,navbar区块使用Bootstrap组件定义了一个简单的导航栏。content区块中有个<div>容器,其中包含一个页头。之前版本中的欢迎消息,现在就放在这个页头里。</p> <ul> <li> <p>使用Bootstrap的模板<br> 如果你从GitHub上克隆了这个应用的Git仓库,那么可以执行git checkout 3b检出应用的这个版本。别忘了在你的虚拟环境中安装Flask-Bootstrap包。Bootstrap官方文档(<a href="https://getbootstrap.com/docs/4.1/getting-started/introduction/%EF%BC%89%E6%98%AF%E5%BE%88%E5%A5%BD%E7%9A%84%E5%AD%A6%E4%B9%A0%E8%B5%84%E6%BA%90%EF%BC%8C%E6%9C%89%E5%BE%88%E5%A4%9A%E5%8F%AF%E4%BB%A5%E7%9B%B4%E6%8E%A5%E5%A4%8D%E5%88%B6%E7%B2%98%E8%B4%B4%E7%9A%84%E7%A4%BA%E4%BE%8B%E3%80%82" target="_blank">https://getbootstrap.com/docs/4.1/getting-started/introduction/)是很好的学习资源,有很多可以直接复制粘贴的示例。</a><br> Flask-Bootstrap的base.html模板还定义了很多其他区块,都可在衍生模板中使用。表3-2列出了所有可用的区块。</p> </li> <li> <p>表Flask-Bootstrap基模板中定义的区块<br> <img src="https://img2020.cnblogs.com/blog/1272669/202103/1272669-20210314221219717-1588129728.png" alt="" loading="lazy"></p> </li> <li> <p>很多区块都是Flask-Bootstrap自用的,如果直接覆盖可能会导致一些问题。例如,Bootstrap的CSS和JavaScript文件在styles和scripts区块中声明。如果应用需要向已经有内容的块中添加新内容,必须使用Jinja2提供的super()函数。例如,如果要在衍生模板中添加新的JavaScript文件,需要这么定义scripts区块:</p> </li> </ul> <pre><code>{% block scripts %} {{ super() }} <script type="text/javascript" src="my-script.js"></script> {% endblock %} </code></pre>