要想在程序中集成Bootstrap,显然要对模板做所有必要的改动。不过,更简单的方法是使用一个名为Flask-Bootstrap 的Flask 扩展,简化集成的过程。
安装:
Flask-Bootstrap 使用pip安装:
pip install flask_bootstrap
Flask 扩展一般都在创建程序实例时初始化,下面是Flask_Bootstrap的初始化方法
加载:
from flask_bootstrap import Bootstrap
初始化:
方法一:
app = Flask(__name__)
Bootstrap(app)
方法二:
实例:
页面加入: { %extends "bootstrap/base.html" %}
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>{% block title %} 首页 {% endblock %}</title>{% block mycss %} {% endblock %}
</head>
<body><nav class="navbar navbar-inverse "><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="#">Liu'BLOG</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="{{url_for('blog.index')}}">首页 <span class="sr-only">(current)</span></a></li><li><a href="{{url_for('article.add')}}">发表博客</a></li><li><a href="{{url_for('blog.uall')}}">显示用户</a></li><li><a href="{{url_for('blog.test')}}">测试钩子函数</a></li></ul><form class="navbar-form navbar-left" action="{{url_for('blog.search')}}" method="post"><div class="form-group"><input type="text" class="form-control" placeholder="输入用户名/手机号码" name="search"></div><button type="submit" class="btn btn-default">搜索用户</button></form><ul class="nav navbar-nav navbar-right">{% if session['uname'] %}<li><a href="{{url_for('blog.udetial')}}">欢迎 {{session['uname']}}</a></li><li><a href="{{url_for('blog.exit')}}">注销</a></li>{% else%}<li><a href="{{url_for('blog.login')}}">登录</a></li><li><a href="{{ url_for('blog.register') }}">注册</a></li>{% endif %}</ul></div><!-- /.navbar-collapse --></div><!-- /.container-fluid -->
</nav>{%extends "bootstrap/base.html"%}
{% block content %} {% endblock %}{% block myjs %} {% endblock %}
</body>
</html>
效果:
Jinja2 中的extends 指令从Flask-Bootstrap 中导入bootstrap/base.html, 从而实现模板继承。Flask-Bootstrap 中的基模板提供了一个网页框架,引入了Bootstrap 中的所有CSS 和JavaScript 文件。基模板中定义了可在衍生模板中重定义的块。block 和endblock 指令定义的块中的内容可添加到基模板中。上面这个user.html 模板定义了3 个块,分别名为title、navbar 和content。这些块都是基模板提供的,可在衍生模板中重新定义。title 块的作用很明显,其中的内容会出现在渲染后的HTML 文档头部,放在<title> 标签中。navbar 和content 这两个块分别表示页面中的导航条和主体内容。在这个模板中,navbar 块使用Bootstrap 组件定义了一个简单的导航条。content 块中有个<div> 容器,其中包含一个页面头部。之前版本的模板中的欢迎信息,现在就放在这个页面头部。运行结果如下图:
Flask-Bootstrap 的base.html 模板还定义了很多其他块,都可在衍生模板中使用,下表列出了所有可用的块:
块名 | 说明 |
doc | 整个html文档 |
html_attribs | html标签属性 |
html | html标签中的内容 |
head | head标签中的内容 |
title | title标签中的内容 |
metas | 一组meta标签 |
styles | 层叠样式表定义 |
body_attribs | body标签的属性 |
body | body标签中的内容 |
navbar | 用户定义的导航条 |
content | 用户定义的页面内容 |
scripts | 文档底部的JavaScript 声明 |
上表中的很多块都是Flask-Bootstrap 自用的,如果直接重定义可能会导致一些问题。例如,Bootstrap 所需的文件在styles 和scripts 块中声明。如果程序需要向已经有内容的块中添加新内容,必须使用Jinja2 提供的super() 函数。例如,如果要在衍生模板中添加新的JavaScript 文件,需要这么定义scripts 块:
{% block scripts %}
{{ super() }}
<script type="text/javascript" src="my-script.js"></script>
{% endblock %}
关于settings配置文件:
BOOTSTRAP_USE_MINIFIED = True # 使用mini版的bootstrap文件
BOOTSTRAP_SERVE_LOCAL = False #是否使用本地服务器来提供bootstrap文件
BOOTSTRAP_LOCAL_SUBDOMAIN = None # 关于blueprint的子域名传输?暂时没用到
BOOTSTRAP_CDN_FORCE_SSL = True # 给CDN加速使用安全的https连接