写在前面:
Flask是一个基于Python开发,依赖jinja2模板和Werkzeug WSGI服务的一个微型框架。Werkzeug用来处理Socket服务,其在Flask中被用于接受和处理http请求;Jinja2被用来对模板进行处理,将模板和数据进行渲染,返回给用户的浏览器。
Bootstrap是由Twitter推出的一个用于前端开发的开源工具包,给予HTML、CSS、JavaScriot,提供简洁、直观、强悍的前端开发框架,是目前最受环境的前端框架。
前面一篇文章已经讲到了,如何通过flask将不同URL的http请求,对应到不同的python函数、不同的html等。
那么下面我们来讲讲,怎么利用Bootstrap框架,快速提供我们想要的前端页面。
由于博主不是专门做这个的,所以下面的内容只是博主的一些理解和实际使用过程中的一些方法,并不能保证完全正确。
开始动手:
首先安装bootstrap扩展
pip install flask-bootstrap
模板的继承
安装完成后,我们可以看到在 \venv\Lib\site-packages\flask_bootstrap\templates\bootstrap路径下,看到bootstrap的一些基础模板
直接通过浏览器打开,会看到html文本的内容,接下来需要将这些模板通过Flask 调用jinja2进行渲染(这一段为博主猜测)
在程序中,导入bootstrap并进行初始化
from flask_bootstrap import Bootstrap
from flask.ext.bootstrap import Bootstrap
bootstrap=Bootstrap(app)
在项目根目录的template目录中,创建html模板,并继承上文中bootstrap这个目录下的base.html
采用继承的这种模式,我们便可以使用在base.html中定义好的块
在app.py中,设置URL“/test”返回该test模板
@app.route('/test')
def test():
return render_template('test.html')
程序运行试一下:
这时可以看到,网页中什么都没有,这是因为我们在test.html文件中,没有使用任何块
我们看一下/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 -%}
由此,我们可以看到,我们可以使用包括head、style、metas、body、navbar、content等等
我们可以利用菜鸟教程网站的一些示例,尝试一下这些块的编写方法,
我们可以试一下导航元素 网址如下:https://www.runoob.com/bootstrap/bootstrap-navigation-elements.html
我们可以尝试,带有下拉菜单的标签页,复制菜鸟教程中的html代码,粘贴在{% block navbar %}{%- endblock navbar %}之间
我们看一下效果:
可以看到,这达到了我们想要的效果,依次类推,我们可以自己定义导航栏的内容,以及其他块的内容等等。
我们可以结合bootstrap网站上的实际案例,定制我们自己想要的网页效果
https://v3.bootcss.com/getting-started/#examples
下面看一下我最终的代码与实现的效果
{% extends "bootstrap/base.html" %}
{%- block head %}
<title>网络自动化管理—欢迎页!</title>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
<meta name="description" content="">
<meta name="author" content="">
<link rel="icon" href="../../favicon.ico">
{%- block styles %}
<!-- Bootstrap -->
<link href="{{bootstrap_find_resource('css/bootstrap.css', cdn='bootstrap')}}" rel="stylesheet">
<!-- Bootstrap core CSS -->
{# <link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">#}
<!-- bb——这里是通过下载网页上的css文件,保存在static目录下即可-->
<link href="static/css/bootstrap.min.css" rel="stylesheet">
<!-- Custom styles for this template -->
<!-- bb——这里是通过下载网页上的css文件,保存在static目录下即可-->
<link href="static/css/carousel.css" rel="stylesheet">
{%- endblock styles %}
{%- endblock head %}
{% block body -%}
{% block navbar %}
<div class="navbar-wrapper">
<div class="container">
<nav class="navbar navbar-inverse navbar-static-top">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
<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="#">功能导航</a>
</div>
<div id="navbar" class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li class="active"><a href="/welcome">首页</a></li>
<li><a href="/InformationDispaly">信息展示</a></li>
<li><a href="/IndexCollect">信息收集</a></li>
<li><a href="/NetAutoRun">配置执行</a></li>
<li><a href="/contact">联系我</a></li>
{# <li class="dropdown">#}
{# <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Dropdown <span class="caret"></span></a>#}
{# <ul class="dropdown-menu">#}
{# <li><a href="#">Action</a></li>#}
{# <li><a href="#">Another action</a></li>#}
{# <li><a href="#">Something else here</a></li>#}
{# <li role="separator" class="divider"></li>#}
{# <li class="dropdown-header">Nav header</li>#}
{# <li><a href="#">Separated link</a></li>#}
{# <li><a href="#">One more separated link</a></li>#}
{# </ul>#}
{# </li>#}
</ul>
</div>
</div>
</nav>
</div>
</div>
{%- endblock navbar %}
{% block content -%}
<div id="myCarousel" class="carousel slide" data-ride="carousel">
<!-- Indicators -->
<ol class="carousel-indicators">
<li data-target="#myCarousel" data-slide-to="0" class="active"></li>
<li data-target="#myCarousel" data-slide-to="1"></li>
<li data-target="#myCarousel" data-slide-to="2"></li>
</ol>
<div class="carousel-inner" role="listbox">
<div class="item active">
<img class="first-slide" src="https://img-blog.csdnimg.cn/2022010618185959747.gif" alt="First slide">
<div class="container">
<div class="carousel-caption">
<h1>CCIE的转变由此开始</h1>
{# <p>Note: If you're viewing this page via a <code>file://</code> URL, the "next" and "previous" Glyphicon buttons on the left and right might not load/display properly due to web browser security rules.</p>#}
<p>这是一个完全由一名网络工程师独立建立的网站</p>
<p>如果你也是一名网络工程师,并同样期待改变,你可以从这里开始</p>
<p><a class="btn btn-lg btn-primary" href="https://blog.youkuaiyun.com/sinat_17736151" role="button">我的优快云博客</a></p>
</div>
</div>
</div>
<div class="item">
<img class="second-slide" src="https://img-blog.csdnimg.cn/2022010618185959747.gif" alt="Second slide">
<div class="container">
<div class="carousel-caption">
<h1>One Step</h1>
<p>首先,你应该构建符合自身职业规划的技术能力栈</p>
<p>如果你也是一名网络工程师,你可以参考我的想法</p>
<p><a class="btn btn-lg btn-primary" href="/stack" role="button">Learn more</a></p>
</div>
</div>
</div>
<div class="item">
<img class="third-slide" src="https://img-blog.csdnimg.cn/2022010618185959747.gif" alt="Third slide">
<div class="container">
<div class="carousel-caption">
<h1>Move on</h1>
<p>在这里,你可以看到我下一步的规划和打算</p>
<p>或许能够对你有所帮助</p>
<p><a class="btn btn-lg btn-primary" href="#" role="button">Learn more</a></p>
</div>
</div>
</div>
</div>
<a class="left carousel-control" href="#myCarousel" role="button" data-slide="prev">
<span class="glyphicon glyphicon-chevron-left" aria-hidden="true"></span>
<span class="sr-only">Previous</span>
</a>
<a class="right carousel-control" href="#myCarousel" role="button" data-slide="next">
<span class="glyphicon glyphicon-chevron-right" aria-hidden="true"></span>
<span class="sr-only">Next</span>
</a>
</div><!-- /.carousel -->
<div class="container marketing">
<!-- Three columns of text below the carousel -->
<div class="row">
<div class="col-lg-4">
<img class="img-circle" src="https://img-blog.csdnimg.cn/2022010618185957995.gif" alt="Generic placeholder image" width="140" height="140">
<h2>信息展示</h2>
<p>提供网络运维相关信息的展示;目前可提供IP地址查询、负载均衡对应关系查询、域名对应关系查询等</p>
<p><a class="btn btn-default" href="#" role="button">View details »</a></p>
</div><!-- /.col-lg-4 -->
<div class="col-lg-4">
<img class="img-circle" src="https://img-blog.csdnimg.cn/2022010618190098196.gif" alt="Generic placeholder image" width="140" height="140">
<h2>信息收集</h2>
<p>针对未进行集中统计的信息,提供定制化信息收集的功能;可提供设备配置收集、设备接口指标定期收集、设备性能指标定期收集、设备日志收集等功能</p>
<p><a class="btn btn-default" href="#" role="button">View details »</a></p>
</div><!-- /.col-lg-4 -->
<div class="col-lg-4">
<img class="img-circle" src="https://img-blog.csdnimg.cn/2022010618190057959.gif" alt="Generic placeholder image" width="140" height="140">
<h2>配置执行</h2>
<p>可针对网络设备,批量下发相关配置;该功能目前主要针对分行、网点、楼层网络设备开放</p>
<p><a class="btn btn-default" href="#" role="button">View details »</a></p>
</div><!-- /.col-lg-4 -->
</div><!-- /.row -->
{%- 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>
<!-- Bootstrap core JavaScript
================================================== -->
<!-- Placed at the end of the document so the pages load faster -->
{# <script src="https://cdn.bootcss.com/jquery/1.12.4/jquery.min.js"></script>#}
<script src="/static/js/jquery.min.js"></script>
<script>window.jQuery || document.write('<script src="../../assets/js/vendor/jquery.min.js"><\/script>')</script>
{# <script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>#}
<script src="/static/js/bootstrap.min.js"></script>
{%- endblock scripts %}
{%- endblock body %}
总结
通过这篇文章,我们掌握到了基本的如何利用Bootstrap框架,快速高效的设计我们的网页
下一篇,我们讲讲如何将页面上的元素与后台应用程序进行联动