Python–flask基础
1.1 Flask程序的实例化
所有Flask程序都必须创建一个程序实例。web服务器使用一种名为web服务器网关接口(WSGI)的协议将来自客户端的所有请求都转交给这个对象处理。程序实例是Flask类的对象,经常使用下述代码创建:
from flask import Flask
app = Flask(__name__)
Flask类的构造函数只有一个必须指定的参数,即主模块或包的名字。在大多数程序中python的__name__就是所需要的值
1.2 路由和视图函数
路由:处理URL和函数之间关系的程序
在 Flask 程序中定义路由的最简便方式,是使用程序实例提供的 app.route 修饰器,把修饰的函数注册为路由。
@app.rout('/')
def index():
return '<h1>Hello World!</h1>'
@app.route("/user/<name>")
def user(name):
return '<h1>Hello,%s!</h1>' %name
像 index() 这样的函数称为视图函数(view function)。视图函数返回的响应可以是包含 HTML 的简单字符串,也可以是复杂的表单
1.3 启动服务器
程序实例用run方法启动Flask集成的开发web服务器
if __name__ == '__main__':
app.run(debug=True)
有一些选项参数可被 app.run() 函数接受用于设置 Web 服务器的操作模式。在开发过程中 启用调试模式会带来一些便利,比如说激活调试器和重载程序。要想启用调试模式,我们 可以把 debug 参数设为 True。
1.4 第一个可执行程序
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return '<h1>Hello World!</h1>'
if __name__ == '__main__':
app.run(debug=True)
1.5.1 请求上下文
变量名 | 上下文 | 说明 |
---|---|---|
current_app | 程序上下文 | 当前激活程序的程序实例 |
g | 程序上下文 | 处理请求时用作临时存储的对象。每次请求都会重设这个变量 |
request | 请求上下文 | 请求对象,封装了客户端发出的 HTTP 请求中的内容 |
session | 请求上下文 | 用户会话,用于存储请求之间需要“记住”的值的词典 |
Flask 在分发请求之前激活(或推送)程序和请求上下文,请求处理完成后再将其删除。程序上下文被推送后,就可以在线程中使用 current_app 和 g 变量。类似地,请求上下文被推送后,就可以使用 request 和 session 变量。如果使用这些变量时我们没有激活程序上 下文或请求上下文,就会导致错误。
1.5.2 请求调度
程序收到客户端发来的请求时,要找到处理该请求的视图函数。为了完成这个任务,Flask 会在程序的 URL 映射中查找请求的 URL。URL 映射是 URL 和视图函数之间的对应关系。 Flask 使用 app.route 修饰器或者非修饰器形式的 app.add_url_rule() 生成映射。
1.5.2 请求钩子
请求钩子使用修饰器实现。Flask 支持以下 4 种钩子。
• 注册一个函数,在处理第一个请求之前运行。 before_first_request
• 注册一个函数,在每次请求之前运行。 before_request
• 注册一个函数,如果没有未处理的异常抛出,在每次请求之后运行。 after_request
• 注册一个函数,即使有未处理的异常抛出,也在每次请求之后运行。teardown_request
1.5.3 Flask扩展
Flask 被设计为可扩展形式,故而没有提供一些重要的功能,例如数据库和用户认证,所 以开发者可以自由选择最适合程序的包,或者按需求自行开发。
使用Flask-Script支持命令行选项
Flask 的开发 Web 服务器支持很多启动设置选项,但只能在脚本中作为参数传给 app.run() 函数。这种方式并不十分方便,传递设置选项的理想方式是使用命令行参数。Flask-Script 是一个 Flask 扩展,为 Flask 程序添加了一个命令行解析器。Flask-Script 自带 了一组常用选项,而且还支持自定义命令
先用pip安装Flask-Script扩展
pip install falsk-script
使用Flask-Script
from flask.ext.script import Manager
manager = Manager(app)
if __name_- == '__main__':
manager.run()
专为 Flask 开发的扩展都暴漏在 flask.ext 命名空间下。Flask-Script 输出了一个名为 Manager 的类,可从 flask.ext.script 中引入。
这个扩展的初始化方法也适用于其他很多扩展:把程序实例作为参数传给构造函数,初始化主类的实例。创建的对象可以在各个扩展中使用。在这里,服务器由 manager.run() 启 动,启动后就能解析命令行了。