简介:python
- 在大多数标准汇总,Flask都算是小型框架,甚至能够成为“微框架”。同时具有高扩展的能力,具备一个包含基本服务的强健核心,其余功能可经过扩展实现。
- 两个主要依赖:路由、调试和Web服务器网关接口子系统有Werkzeug提供;模板系统由Jinja2提供。
先将实验文件从git的仓库中下载到本地,而且切换到1a分支:git
$ git clone https://github.com/miguelgrinberg/flasky.git $ cd flasky $ git checkout 1a
查看是否安装了virtualenv(虚拟环境使用第三方实用工具):github
virtualenv --version
结果显示错误,则表示没安装,安装命令:flask
pip install virtualenv
使用virtualenv命令在flasky文件夹中建立Python虚拟环境:服务器
virtualenv venv
virtualenv命令中只要一个必须参数,venv便是虚拟环境的名字。而且会建立一个子文件夹,全部与虚拟环境相关的文件都会保存在这个文件夹中。cookie
source vev/bin/activate
退出当前虚拟环境,回到全局Python解释器中:网络
deactivate
进入flasky文件,激活虚拟环境,使用pip命令安装Flask:session
$ cd flasky $ source venv/bin/activate $ pip install flask
全部Flask程序都必须建立一个程序实例。Web服务器使用一种WSGI的协议,把接收自客户端的全部请求都交由这个对象处理。程序实例是Flask类的对象。app
from flask import Flask app = Flask(__name__)
客户端把请求发送给Web服务器,Web服务器将请求发送给Flask程序实例。程序实例须要只要知道每一个URL请求运行那些代码,即URL到Python函数的映射关系。
处理URL和Python函数之间的关系的程序成为路由
视图函数返回的响应能够包括HTML的简单字符串,也能够是复杂的表单。框架
程序实例用run方法启动Flask集成的开发Web服务器:
if __name__ == “__main__”: app.run(debug=True)
将前几节介绍的Flask Web程序的不一样组成部分合并到一个hello.py文件
from flask import Flask app = Flask(__name__) @app.route('/') def index(): return '<h1>Hello World!</h1>' if __name__ == "__main__": app.run(debug=True)
切换到虚拟环境,执行hello.py文件,启动Flask程序:
$: curl 127.0.0.1:5000
优化成包含动态路由的Flask程序
from flask import Flask app = Flask(__name__) @app.route('/') def index(): return '<h1>Hello World!</h1>' if __name__ == "__main__": app.run(debug=True)
测试效果
Flask从客户端接收到的请求,要让视图函数访问请求对象,一种显而易见的方式就是将其做为参数传入视图函数,不过致使程序中的每一个视图函数都会增长一个参数。
为了不大量无关紧要的参数把视图函数弄的一团糟,Flask使用了上下文临时把某些对象变为全局可访问。在Flask中有两种上下文:程序上下文和请求上下文
- 变量名 上下文 说明
- current_app 程序上下文 当前激活程序的实例
- g 程序上下文 处理请求时用做临时存储的对象,每次请求都会重设这个变量
- request 请求上下文 请求对象,封装了客户端发出的HTTP请求中的内容
- session 请求上下文 用户会话,用于存储请求之间须要“记住”的值的词典。
程序收到客户端发送的请求,要找处处理该请求的视图函数。
Flask会在程序的URL映射中查找请求的URL。URL映射是URL和视图函数之间的对应关系。
Flask使用app.route修饰器或者非修饰器形式的app.add_url_rule()生成映射。
>> >> from hello import app >> app.url_map Map([<Rule '/' (HEAD, OPTIONS, GET) -> index>, <Rule '/static/<filename>' (HEAD, OPTIONS, GET) -> static>, <Rule '/user/<name>' (HEAD, OPTIONS, GET) -> user>])
URL映射中的HEAD、Options、GET是请求方法,由路由进行处理。
有时候在处理请求以前或以后执行代码会颇有用。请求钩子使用修饰器实现,Flask支持如下4种钩子:
- before_firest_request: 注册一个函数,在处理第一个请求以前运行
- before_request: 注册一个函数,在每次请求执勤啊运行
- after_request: 注册一个函数,若是没有未处理的异常抛出,在每次请求以后运行。
- teardown_request: 注册一个函数,即便有未处理的异常抛出,也在每次请求以后运行。
在大多数状况下,响应就是一个简单的字符串,做为HTML页面传回客户端。但HTTP协议须要的不只是做为请求响应的字符串。
其中HTTP响应中一个很重要的部分是状态码,Flask默认为200.
make_response()函数可接受1个、2个或3个参数,并返回一个Response对象。
from flask import make_response @app_route(‘/’) def index(): response = make_response(‘<h1>This document carries a cookie!</h1>’) response.set_cookie(‘answer’,’42’) return response
from flask import redirect @app.route(‘/’) def index(): return redirect(“http://www.example.com”)
还有一种特殊的响应有abort函数生成,用于处理错误。
使用Flask-Script支持命令行选项
Flask-Script是一个Flask扩展,为Flask程序添加一个命令行解析器。Flask-Script自带了一组经常使用选项,并且还支持自定义命令。
pip install flask-script
from flask import Flask from flask_script import Manager app = Flask( __name__ ) manager = Manager( app ) @app.route(‘/’) def index(): return ‘<h1>hello,world</h1>’ @app.route(‘/user/<name>’) def user(name): return ‘<h1>hello,%s!</h1>’ % name if __name__ == “__main__”: manager.run()
若是已经从git上克隆了该仓库,能够直接切换到2c分支上。
这样修改以后,程序可使用一组基本命令行选项,如今运行hello.py
- --host参数告诉Web服务器在哪一个网络接口上监听来自客户端的链接。
- --port参数告诉Web服务器在哪一个网络端口。
python hello.py runserver --host 0.0.0.0 --port 9999