Flask简介
Flask是一个使用 Python 编写的轻量级 Web 应用框架。其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 。Flask使用 BSD 授权。
Flask也被称为 “microframework” ,因为它使用简单的核心,用 extension 增加其他功能。Flask没有默认使用的数据库、窗体验证工具。
1.Flask安装
在Linux中安装Flask框架(假设已经安装了Python3环境),可以使用如下命令:
pip3 install Flask
如果安装成功,可以看到类似如下的内容:
Successfully installed Flask-1.0.2 Werkzeug-0.15.2 click-7.0 itsdangerous-1.1.0
2.基本语法
(1)初始化
所有Flask程序都必须创建一个程序实例,Web服务器使用一种名为Web服务器网关接口的的协议(WSGI),把接收自客户端的所有请求转发给这个对象处理。程序实例是Flask类的对象,使用下面代码构建:
from flask import Flask
app = FLask(__name__)
Flask类的构造函数只有一个必须指定的参数,即程序主模块或则包的名称。。在大多数程序中,Python 的name 变量就是所需的值。
(2)路由和视图函数
客户端把请求转发给Web服务器,Web服务器再把请求发送给Flask程序实例。程序实例需要知道对于每个URL请求,运行哪些代码,所以保存一个URL请求到Python函数的映射关系。处理URL和函数映射关系的程序称为路由。
在Flask 程序中定义路由的最简便方式,是使用程序实例提供的app.route 修饰器,把修饰的函数注册为路由。下面的例子说明了如何使用这个修饰器声明路由:
@app.route("/")
def index():
return "<h1>hello,Flask</h1>"
这里把index() 函数注册为程序根地址的处理程序。在浏览器中访问网站首页后,会触发服务器执行index() 函数。这个函数的返回值叫做响应,是客户端接收到的内容。像index这样的函数称为视图函数。视图函数的返回的响应可以是简单的html,也可以是复杂的表单。
(3)启动服务器
程序实例用run 方法启动Flask 集成的开发Web 服务器:
if __name == '___main_':
app.run(debug=True)
name=='main' 是Python 的惯常用法,在这里确保直接执行这个脚本时才启动开发Web 服务器。如果这个脚本由其他脚本引入,程序假定父级脚本会启动不同的服务器,因此不会执行app.run()。
服务器启动后,会进入轮询,等待并处理请求。轮询会一直运行,直到程序停止,比如按Ctrl-C 键
有一些选项参数可被app.run() 函数接受用于设置Web 服务器的操作模式。在开发过程中启用调试模式会带来一些便利,比如说激活调试器和重载程序。要想启用调试模式,我们可以把debug 参数设为True。
3.Hello World网页
建立一个代码文件testweb.py,内容如下:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return '<h1>hello,flask</h1>'
if __name__ == '__main__':
app.run(debug=True)
然后,在Linux Shell环境中执行如下命令:
python3 testweb.py
然后,屏幕上会出现如下信息:
* Serving Flask app "testweb" (lazy loading)
* Environment: production
WARNING: Do not use the development server in a production environment.
Use a production WSGI server instead.
* Debug mode: on
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: 267-367-823
这时,可以在Linux系统中,打开一个浏览器,在地址栏中输入“http://localhost:5000” 就可以在网页中看到Hello World文字了。
使用网页模板
在网页目录下,创建一个templates目录,把模板文件存放在该目录下,比如,在这个模板目录下建立一个index.html,内容如下:
<html>
<head>
<title>Welcome</title>
</head>
<body>
<h1>Database Lab of Xiamen University</h1>
</body>
</html>
然后,把testweb.py的内容修改为如下:
from flask import Flask
from flask import render_template
app = Flask(__name__)
@app.route('/')
def index():
return render_template("index.html")
if __name__ == '__main__':
app.run(debug=True)
使用Ctrl+C组合键,把原来已经在运行的testweb.py结束掉,然后,在Linux Shell环境中执行如下命令:
python3 testweb.py
就可以看到网页了。
向网页模板传递值
把testweb.py修改为:
from flask import Flask
from flask import render_template
app = Flask(__name__)
@app.route('/')
def index():
user = {'username': 'Xiaoming'}
return render_template("index.html",
title='Welcome',
user=user)
if __name__ == '__main__':
app.run(debug=True)
把index.html文件修改为:
<html>
<head>
<title>{{title}}</title>
</head>
<body>
<h1>Hello {{user.username}}</h1>
<h1>Database Lab of Xiamen University</h1>
</body>
</html>
使用Ctrl+C组合键,把原来已经在运行的testweb.py结束掉,然后,在Linux Shell环境中执行如下命令:
python3 testweb.py
就可以看到网页了。
使用pyecharts实现网页绘图
在网页目录下新建draw.py文件,内容如下:
# -*- coding: utf-8 -*-
from pyecharts import Bar
def draw_bar():
print("开始绘图")
attr = ["海沧", "湖里", "集美", "思明", "翔安", "同安"]
v0 = [10,30,20,15,22,23]
v1 = [10,30,20,15,22,23]
v2 = [10,30,20,15,22,23]
v3 = [10,30,20,15,22,23]
bar = Bar("厦门市租房租金概况")
bar.add("最小值", attr, v0, is_stack=True)
bar.add("最大值", attr, v1, is_stack=True)
bar.add("平均值", attr, v2, is_stack=True)
bar.add("中位数", attr, v3, is_stack=True)
bar.render('./templates/result.html')
print("结束绘图")
把testweb.py修改为:
from flask import Flask
from flask import render_template
import draw
app = Flask(__name__)
@app.route('/')
def index():
draw.draw_bar()
return render_template("result.html")
if __name__ == '__main__':
app.run(debug=True)
使用Ctrl+C组合键,把原来已经在运行的testweb.py结束掉,然后,在Linux Shell环境中执行如下命令:
python3 testweb.py
就可以看到网页中的彩色柱状图了。
绘制多个值对比的柱状图
把draw.py文件的内容修改为如下:
# -*- coding: utf-8 -*-
from pyecharts import Bar
def draw_bar():
w=[[0.5,0.4,0.3],[0.4,0.5,0.3],[0.3,0.4,0.5],[0.5,0.3,0.4]]
attr = ["决策树", "随机森林", "logistic回归"]
bar = Bar("tf-idf分类结果图")# 创建条形图对象
bar.add("accuracy",attr,w[0])
bar.add("precision",attr,w[1])
bar.add("recall",attr,w[2])
bar.add("f1",attr,w[3])
bar.render('./templates/result.html')
testweb.py不变,还是如下:
from flask import Flask
from flask import render_template
import draw
app = Flask(__name__)
@app.route('/')
def index():
draw.draw_bar()
return render_template("result.html")
if __name__ == '__main__':
app.run(debug=True)
使用Ctrl+C组合键,把原来已经在运行的testweb.py结束掉,然后,在Linux Shell环境中执行如下命令:
python3 testweb.py
就可以看到网页中的彩色柱状图了。
使用网页表单
把index.html内容修改为如下:
<html>
<head>
<title>Welcome</title>
</head>
<body>
<h1>Database Lab of Xiamen University</h1>
<form method="POST" action="login">
<input type="text" name="username" placeholder="username">
<br>
<input type="password" name="password" placeholder="password">
<br>
<input type="submit" value="Submit">
<input type="reset" value="reset">
</form>
</body>
</html>
把testweb.py的内容修改为如下:
from flask import Flask
from flask import request
from flask import render_template
import draw
app = Flask(__name__)
@app.route('/')
def index():
return render_template("index.html")
@app.route('/login', methods=['post'])
def login():
username = request.form.get('username')
password = request.form.get('password')
return render_template('loginsuccess.html', username=username,password=password)
if __name__ == '__main__':
app.run(debug=True)
在templates目录下再新建一个loginsuccess.html,内容如下:
<html>
<head>
<title>Welcome</title>
</head>
<body>
<h1>Login Success. Name is:{{username}},Password is :{{password}}</h1>
</body>
</html>
使用Ctrl+C组合键,把原来已经在运行的testweb.py结束掉,然后,在Linux Shell环境中执行如下命令:
python3 testweb.py
如下图所示,会出现一个网页表单,可以在里面输入用户名和密码,点击提交,就可以在网页中显示刚才输入的用户名和密码。
制作下拉列表
把index.html的内容修改为如下:
<html>
<head>
<title>Welcome</title>
</head>
<body>
<h1>Database Lab of Xiamen University</h1>
<form method="POST" action="login">
<select name="wordvector">
<option selected="selected">--please select word vector--</option>
<option value=1 >TF-IDF</option>
<option value=2>Word2Vec</option>
</select>
<select name="classifier">
<option selected="selected">--please select classifier--</option>
<option value=1 >逻辑斯蒂回归</option>
<option value=2>决策树</option>
<option value=3>随机森林</option>
</select>
<input type="submit" value="Submit">
<input type="reset" value="reset">
</form>
</body>
</html>
把testweb.py的内容修改为如下:
from flask import Flask
from flask import request
from flask import render_template
import draw
app = Flask(__name__)
@app.route('/')
def index():
return render_template("index.html")
@app.route('/login', methods=['post'])
def login():
wordvector = request.form.get('wordvector')
classifier = request.form.get('classifier')
return render_template('submitsuccess.html', wordvector=wordvector,classifier=classifier)
if __name__ == '__main__':
app.run(debug=True)
在templates目录下表再新建一个submitsuccess.html,内容如下:
<html>
<head>
<title>Submit Success</title>
</head>
<body>
<h1>Form Submit Success. Word Vector is:{{wordvector}},Classfifier is :{{classifier}}</h1>
</body>
</html>
使用Ctrl+C组合键,把原来已经在运行的testweb.py结束掉,然后,在Linux Shell环境中执行如下命令:
python3 testweb.py
如下图所示,会出现一个网页表单,包含两个下拉列表框,可以选择以后点击提交按钮,就会在新网页中看到你选择的内容(整数值)。
增加if语句判断
index.html的内容不变,还是如下:
<html>
<head>
<title>Welcome</title>
</head>
<body>
<h1>Database Lab of Xiamen University</h1>
<form method="POST" action="login">
<select name="wordvector">
<option selected="selected">--please select word vector--</option>
<option value=1 >TF-IDF</option>
<option value=2>Word2Vec</option>
</select>
<select name="classifier">
<option selected="selected">--please select classifier--</option>
<option value=1 >逻辑斯蒂回归</option>
<option value=2>决策树</option>
<option value=3>随机森林</option>
</select>
<input type="submit" value="Submit">
<input type="reset" value="reset">
</form>
</body>
</html>
把testweb.py的内容修改为如下:
from flask import Flask
from flask import request
from flask import render_template
import draw
app = Flask(__name__)
@app.route('/')
def index():
return render_template("index.html")
@app.route('/login', methods=['post'])
def login():
wordvector = request.form.get('wordvector')
classifier = request.form.get('classifier')
if wordvector=="1":
if classifier=="1":
print("TF-IDF+logisticregression")
elif classifier=="2":
print("TF_IDF+decisiontree")
elif classifier=="3":
print("TF-IDF+randomforest")
elif wordvector=='2':
if classifier=="1":
print("Word2Vec+logisticregression")
elif classifier=="2":
print("Word2Vec+decisiontree")
elif classifier=="3":
print("Word2Vec+randomforest")
return render_template('submitsuccess.html', wordvector=wordvector,classifier=classifier)
if __name__ == '__main__':
app.run(debug=True)
submitsuccess.html内容不变,如下:
<html>
<head>
<title>Submit Success</title>
</head>
<body>
<h1>Form Submit Success. Word Vector is:{{wordvector}},Classfifier is :{{classifier}}</h1>
</body>
</html>
使用Ctrl+C组合键,把原来已经在运行的testweb.py结束掉,然后,在Linux Shell环境中执行如下命令:
python3 testweb.py
然后,就可以在网页中依次选择不同的下拉列表选项,点击提交,然后,可以在运行testweb.py的终端内查看控制台输出的日志信息。