参考博文链接:https://blog.csdn.net/linshuhe1/article/details/51742474
前端开源框架 Bootstrap, 使用Bootstrap可以去创建简洁、美观的页面。
在前面,我们已经使用了 Python + Flask 去创建一个简单的线性回归模型预测 web,使用html模板进行页面展示。在这里,为了更好的展示,引入了一个简化在 Flask 项目中集成前端开源框架 Bootstrap 的Flask扩展 ,一个插件 flask-bootstrap 。
安装这个插件库: flask-bootstrap:
pip install flask-bootstrap
在python脚本中导入 Bootstrap 库,创建一个 Bootstrap 实例:
from flask_bootstrap import Bootstrap
app = Flask(__name__)
bootstrap = Bootstrap(app)
if __name__ == '__main__':
app.run()
在该python文件 *.py 同级别下的 templates 文件目录下创建一个 前端模板文件 html 文件,名为 base.html ,建议名称就写为 base.html。
base.html:
{% extends "bootstrap/base.html" %}
{% block title %}Flask{% 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 navigationspan>
<span class="icon-bar">span>
<span class="icon-bar">span>
<span class="icon-bar">span>
button>
<a class="navbar-brand" href="/">Flaskya>
div>
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li><a href="/">Homea>li>
ul>
div>
div>
div>
{% endblock %}
{% block content %}
<div class="container">
{% block page_content %}{% endblock %}
div>
{% endblock %}
我们使用这个 base.html 作为一个基础模板,一个骨架。对于其它的前端模板,可以直接继承这个 base.html的 页面渲染效果, 相当于base.html 集成了一个前端页面, 然后其他的页面继承它, 在这个基础上 进行修改 重载 重写 就可以完成新的页面, 可以加快页面的编写, 尤其对于我这种不熟悉前端框架的疼来讲。 便于开发
其中的标签的意义:
创建一个页面 html, 用于真正显示的页面的内容, 在代码中 直接去继承这个 base.html 基础模板即可。创建的文件名字为:test_bootstrap.html:
{% extends "base.html" %}
{% block title %}linearRegression{% endblock %}
{% block page_content %}
<div class="page-header">
<h1>Hello, {{ name }}!h1>
div>
{% endblock %}
后端的代码:
from flask_bootstrap import Bootstrap
from flask import Flask, render_template
app = Flask(__name__)
bootstrap = Bootstrap(app)
@app.route('/bootstrap/' )
def flask_bootstrap_test(name):
return render_template('test_bootstrap.html',name = name)
if __name__ == '__main__':
app.run()
运行代码进行测试:http://127.0.0.1:5000/bootstrap/alzn
结果如下所示:
可以发现,这个 Flasky 和 Home 导航栏 , 集成了 Bootstrap 框架的插件 flask-bootstrap
后端的代码:
# -*- coding: utf-8 -*-
from flask_bootstrap import Bootstrap
from flask import Flask, render_template, request, redirect, url_for, jsonify
from werkzeug.utils import secure_filename
import os
import time
app = Flask(__name__)
bootstrap = Bootstrap(app)
@app.route('/bootstrap/' )
def flask_bootstrap_test(name):
return render_template('test_bootstrap.html',name = name)
UPLOAD_FOLDER = 'upload'
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER # 设置文件上传的目标文件夹
basedir = os.path.abspath(os.path.dirname(__file__)) # 获取当前项目的绝对路径
ALLOWED_EXTENSIONS = set(['txt', 'png', 'xlsx']) # 允许上传的文件后缀
# 判断文件是否合法
def allowed_file(filename):
return '.' in filename and filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS
# 具有上传功能的页面
@app.route('/')
def upload_test():
return render_template('api_upload_bootstrap.html')
@app.route('/api/upload', methods=['POST'], strict_slashes=False)
def api_upload():
print("有开始执行吗?")
file_dir = os.path.join(basedir, app.config['UPLOAD_FOLDER']) # 拼接成合法文件夹地址
if not os.path.exists(file_dir):
os.makedirs(file_dir) # 文件夹不存在就创建
f = request.files['myfile'] # 从表单的file字段获取文件,myfile为该表单的name值
if f and allowed_file(f.filename): # 判断是否是允许上传的文件类型
fname = f.filename
ext = fname.rsplit('.', 1)[1] # 获取文件后缀
f.save(os.path.join(file_dir, fname)) # 保存文件到upload目录
#return jsonify({"errno": 0, "errmsg": "上传成功"})
return render_template('api_upload_bootstrap.html')
else:
return jsonify({"errno": 1001, "errmsg": "upload fail"})
if __name__ == '__main__':
app.run()
对于用户自己定义的页面: api_upload_bootstrap.html :
{% extends "base.html" %}
{% block title %}DSCAnalysisWeb{% endblock %}
{% block page_content %}
<h1>文件上传示例h1>
<form id="form1" method="post" action="/api/upload" enctype="multipart/form-data">
<div>
<input id="File1" type="file" name="myfile"/>
<input type="submit">上传input>
div>
{% endblock %}
<form id="form1" method="post" action="/api/upload" enctype="multipart/form-data">
<div>
<input id="File1" type="file" name="myfile"/>
<input type="submit">上传input>
div>
body>
html>
--!
运行测试界面: