Flask_0x01 安装 & 程序基本结构
0x1 使用虚拟环境
示例代码
$ git clone https://github.com/miguelgrinberg/flasky.git $ cd flasky $ git checkout 1a
1.1 安装virtualenv
1 Ubuntu : $ sudo apt-get install python-virtualenv
2 Mac OS X : $ sudo easy_install virtualenv
3 Windows : https://bitbucket.org/pypa/setuptools 下载ez_setup.py
4 $ python ez_setup.py
5 $ easy_install virtualenv
1.2 用virtualenv创建python虚拟环境命名为venv
$ virtualenv venv
激活虚拟环境
Linux/Mac: $ source venv/bin/activate
Windows : $ venv\Scripts\activate
回到全局Python解释器
$ deactivate
虚拟环境中安装flask
(venv)$ pip install flask
0x2 程序基本结构
2.1 初始化,创建程序实例
from flask import Flask
app = Flask(__name__)
Flask用name参数决定程序的根目录,以便能够找到相对于程序根目录的资源文件位置
2.2 路由
路由:处理URL和函数之间关系的程序
定义路由:使用app.route修饰器,把修饰的函数注册为路由
@app.route('/')
def index():
return '<h1>Hello World</h1>'
路由中定义动态名字:
@app.route('/user/<name>')
def user(name):
return '<h1>Hello, %s!</h1>' % name
路由动态部分默认使用字符串,也可以使用类型定义e.g /user/<int:id>只匹配id为整数的url
2.3 启动服务器
程序实例用run方法启动Flask集成的Web服务器
if __name__ == '__main__':
app.run(debug=True)
Flask提供的Web服务器不适用在生产环境中使用
2.4 请求-响应
Flask使用上下文临时把某些对象变为全局可访问
@app.route('/')
def index():
user_agent = request.headers.get('User-Agent')
return '<p>Your browser is %s</p>' % user_agent
在程序实例上调用app.app_context()可获得一个程序上下文
from hello import app
from flask import current_app
app_ctx = app.app_context()
app_ctx.push()
current_app.name
app_ctx.pop()
查看hello.py生成的映射
(venv) $ python
>>> from hello import app
>>> app.url_map
/static/<filename> 路由是Flask添加的特殊路由,用于访问静态文件
请求钩子
before_first_request:注册一个函数,在处理第一个请求之前运行
before_request:注册一个函数,在每次请求之前运行
after_request:注册一个函数,如果没有未处理的异常抛出,在每次请求之后运行
teardown_request:注册一个函数,即使有未处理的异常抛出,也在每次请求之后运行
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
Flask提供redirect()辅助函数,用于生成重定向响应
from flask imort redirect
@app.route('/')
def index():
return redirect('http://www.xxx.com')
about() 函数用于处理错误
URL中id对应的用户不存在,返回状态码404 from flask import about @app.route('/user/<id>') def get_user(id): user = load_user(id) if not user: abort(404) return '<h1>Hello, %s</h1>' % user.name
about不会把控制权交给调用它的函数,而是抛出异常把控制权交给Web服务器
2.6 Flask扩展
Flask-Script为Flask添加了一个命令行解析器
(venv) $ pip install flask-script
为Flask开发的扩展都在flask.ext命名空间下
初始化方法:把程序实例作为参数传给构造函数,初始化主类的实例
from flask.ext.script import Manager manager = Manager(app)
#...
if __name__ == '__main__':
manager.run()
(venv) $ python hello.py runserver --help
Flask默认监听localhost上的连接 --host 0.0.0.0 允许同网中的其他计算机连接服务器
(venv) $ python hello.py runserver --host 0.0.0.0