数据可视化之flask入门
一.视图
所有Flask程序必须有一个程序实例
Flask调用视图函数后,会将视图函数的返回值作为响应的内容,返回给客户端。一般情况下,响应内容主要是字符串和状态码。
当客户端想要获取资源时,一般会通过浏览器发起HTTP请求。此时,Web服务器使用WSGI(Web Server Gateway Interface)协议,把来自客户端的所有请求都交给Flask程序实例。WSGI是为 Python语言定义的Web服务器和Web应用程序之间的一种简单而通用的接口,它封装了接受HTTP请求、解析
HTTP请求、发送HTTP,响应等等的这些底层的代码和操作,使开发者可以高效的编写Web应用
程序实例使用Werkzeug来做路由分发(URL请求和视图函数之间的对应关系)。根据每个URL请求,找到具体的视图函数。在Flask程序中,路由的实现一般是通过程序实例的route
装饰器实现
route装饰器内部会调用add_url_route()
方法实现路由注册
调用视图函数,获取响应数据后,把数据传入HTML模板文件中,模板引擎负责渲染响应数据,然后由Flask返回响应数据给浏览器,最后浏览器处理返回的结果显示给客户端
所需扩展包
Flask-SQLalchemy
:操作数据库;
Flask-migrate
:管理迁移数据库;
Flask-Mail
:邮件;
Flask-WTF
:表单;
Flask-script
:插入脚本;
Flask-Login
:认证用户状态;
Flask-RESTful
:开发REST API的工具;
Flask-Bootstrap
:集成前端Twitter Bootstrap框架;
Flask-Moment
:本地化日期和时间
1.HelloWorld
新建文件hello.py:
# 导入Flask类
from flask import Flask
#Flask类接收一个参数__name__
app = Flask(__name__)
# 装饰器的作用是将路由映射到视图函数index
@app.route('/')
def index():
return 'Hello World'
# Flask应用程序实例的run方法启动WEB服务器
if __name__ == '__main__':
app.run()
2.调试模式
开启Debug模式,可以更好的定位错误,还可以既是刷新修改的页面,不用重启服务器
app.run(debug=True) #Pycharm中不起作用
在运行的环境配置中,勾选Flask Debug
3.给路由器传参
有时我们需要将同一类URL映射到同一个视图函数处理,比如:使用同一个视图函数来显示不同用户的个人信息
通过向规则参数添加变量部分,可以动态构建URL。此变量部分标记为。它作为关键字参数传递给与规则相关联的函数
from flask import Flask
app = Flask(__name__)
@app.route('/hello/<name>')
def hello_name(name):
return 'Hello %s!' % name
if __name__ == '__main__':
app.run(debug = True)
路由传递的参数默认当做string处理,这里指定int
,尖括号中冒号后面的内容是动态的
@app.route('/user/<int:id>')
def hello_itcast(id):
return 'hello ,welcome user %d' %id
除了默认字符串变量部分之外,还可以使用以下转换器构建规则
1 int接受整数
2 float对于浮点值
3 path 接受用作目录分隔符的斜杠
路由的路径不能重复
@app.route('/test/') #/test 和上面/user不同,相同的/user后面可以接不同的类型
def test(name):
return 'welcome'
3.模板
视图函数的主要作用是生成请求的响应,这是最简单的请求。实际上,视图函数有两个作用:处理业务逻辑和返回响应内容。在大型应用中,把业务逻辑和表现内容放在一起,会增加代码的复杂度和维护成本。本节学到的模板,它的作用即是承担视图函数的另一个作用,即返回响应内容。 模板其实是一个包含响应文本的文件,其中用占位符(变量)表示动态部分,告诉模板引擎其具体值需要从使用的数据中获取。使用真实值替换变量,再返回最终得到的字符串,这个过程称为“渲染”。Flask使用Jinja2这个模板引擎来渲染模板。Jinja2能识别所有类型的变量,包括{}。 Jinja2模板引擎,Flask提供的
render_template函数封装了该模板引擎,render_template函数的第一个参数是模板的文件名,后面的参数都是键值对,表示模板中变量对应的真实值
Jinja2官方文档http://docs.jinkan.org/docs/jinja2/
模板的简单使用:
@app.route('/')
def hello():
return render_template('index.html')
@app.route('/user/<name>')
def hello_user(name):
return render_template('index.html',name=name)
反向路由:
Flask提供了url_for()
辅助函数,可以使用程序URL映射中保存的信息生成URL;url_for()
接收视图函数名作为参数,返回对应的URL;如调用url_for('index',_external=True)
返回的是绝对地址,在下面这个示例中是http://127.0.0.1:5000/index
@app.route('/index')
def index():
return render_template('index.html')
@app.route('/user/')
def redirect():
return url_for('index',_external=True)
url_for()**
函数对于动态构建特定函数的URL非常有用。该函数接受函数的名称作为第一个参数,以及一个或多个关键字参数,每个参数对应于URL的变量部分
演示如何使用url_for()
函数
from flask import Flask, redirect, url_for
app = Flask(name)
@app.route('/admin')
def hello_admin():
return 'Hello Admin'
@app.route('/guest/')
def hello_guest(guest):
return 'Hello %s as Guest' % guest
@app.route('/user/')
def hello_user(name):
if name =='admin':
return redirect(url_for('hello_admin'))
else:
return redirect(url_for('hello_guest',guest = name))
if name == 'main':
app.run(debug = True)
上述脚本有一个函数user(name)
,它接受来自URL的参数的值。
User()
函数检查接收的参数是否与’admin
'匹配。如果匹配,则使用url_for()
将应用程序重定向到hello_admin()
函数,否则重定向到将接收的参数作为guest
参数传递给它的hello_guest()
函数
保存上面的代码并从Python shell运行
打开浏览器并输入URL - http://localhost:5000/user/admin
浏览器中的应用程序响应是
Hello Admin
在浏览器中输入以下URL - http://localhost:5000/user/mvl
应用程序响应现在更改为:
Hello mvl as Guest
4.变量
在模板中{{ variable }}
结构表示变量,是一种特殊的占位符,告诉模板引擎这个位置的值,从渲染模板时使用的数据中获取;Jinja2除了能识别基本类型的变量,还能识别{}
;
<p>{{mydict['key']}}</p>
<p>{{mylist[1]}}</p>
<p>{{mylist[myvariable]}}</p>
from flask import Flask,render_template
app = Flask(__name__)
@app.route('/')
def index():
mydict = {'key':'silence is gold'}
mylist = ['Speech', 'is','silver']
myintvar = 0
return render_template('vars.html',
mydict=mydict,
mylist=mylist,
myintvar=myintvar )
if __name__ == '__main__':
app.run(debug=True)
5.Web表单
web表单是web应用程序的基本功能
它是HTML页面中负责数据采集的部件。表单有三个部分组成:表单标签、表单域、表单按钮。表单允许用户输入数据,负责HTML页面数据采集,通过表单将用户输入的数据提交给服务器。Flask 将表单数据发送到模板
在URL规则中指定http方法,触发函数接收的Form数据可以以字典对象的形式收集它并将其转发到模板以在相应的网页上呈现它
在以下示例中,'/'
URL会呈现具有表单的网页(student.html
)。填入的数据会发布到触发 result()
函数的'/result'
URL。 results()
函数收集字典对象中的request.form
中存在的表单数据,并将其发送给result.html
。
该模板动态呈现表单数据的HTML表格
下面给出的是student.html
的HTML脚本
<form action = "http://localhost:5000/result" method = "POST">
<p>Name <input type = "text" name = "Name" /></p>
<p>Physics <input type = "text" name = "Physics" /></p>
<p>Chemistry <input type = "text" name = "chemistry" /></p>
<p>Maths <input type ="text" name = "Mathematics" /></p>
<p><input type = "submit" value = "submit" /></p>
</form>
模板(result.html
)
<!doctype html>
<table border = 1>
{% for key, value in result.items() %}
<tr>
<th> {{ key }} </th>
<td> {{ value }} </td>
</tr>
{% endfor %}
</table>