flask框架
- WSGI: Werkzeug
- web server gateway interface, 把来自客户端的请求发送给flask程序处理
- template: jinjia2
- 数据库和其他组件都可自选
虚拟环境
python2.7: virtualenv
python3.4: pyvenv
使用虚拟环境:
virtualenv env
source env/bin/activate
deactivate
我的目录
实操目录(可githook到vps):~/flask/flask_project
教程源码目录:~/flask/flasky
git check out 1a
2.1 初始化
wsgi把request交给下面代码中的app对象来处理,name是根目录,以后的相对路径都是相对于name
~/flask/flask_project/app.py:
from flask import Flask, jsonify
app = Flask(__name__)
2.2 路由routes 和视图 view 函数
路由:针对网站上不同url的请求交给哪个函数进行处理
定义方法:使用app.route修饰器,修饰index函数:
@app.route('/')
def index():
return 'hello world'
修饰器可以修改函数的行为,注册函数为事件(event)的处理程序(handler),
上面index()是个view function 视图函数,每个视图函数就是处理一个请求,生成一个返回的网页。
在route中使用变量—尖括号angle brackets部分,作为变量传入紧跟着的视图函数:
@app.route('/user/<name>')
def user(name):
return 'hello, %s' %name
可以有这三种路径filter:
<int:id> 匹配为整数的id部分
<path># 不被slash分隔的字符串,匹配包含子目录的字符串
<float>
2.3 启动服务
‘name == ‘main‘’的作用是只有此程序被直接执行(如python x.py)才运行下面代码,如果只是import就不运行.
‘debug=True’:开启调试模式
if __name__ == '__main__':
app.run(debug=True)
启动之后就一直运行着app对象,等待请求并进行响应.
页码Eng 12,CHS 11
2.5 请求和响应
request and response
这部分讲的是设计思想,比较精髓。
服务器转发来的请求传给视图函数处理,生成响应。
2.5.1 Context 上下文
context提供各种当前程序需要的变量和语境。
Context让一个变量(如一个request)在一个线程thread中作为全局可见变量.需要激活(运行app.app_context())后才可见.
两种context:
- applicaiton context
- current_app 当前激活的程序实例
- g 临时存储的对象
- request context
- request 请求对象
- session 用户会话
2.5.2 请求调度
flask在URL映射中找该把一个请求交给哪个视图函数来处理。
除了用app.route修饰器来分配(dispatch)请求给哪个视图函数处理之外,还可以用app.add_url_rule()
app.url_map()显示当前所有的路由map
程序主要是处理GET请求,HEAD OPTIONS由flask自动处理。
2.5.3 请求钩子hook
在请求的不同处理阶段自动调用一段代码,比如一些比较经常复用的代码段.
用装饰器实现,有四种.
g context全局变量用来做data的swap缓存区域,共享数据.
2.5.4 响应
view function的返回值作为响应response.
响应除了字符串作为html之外,还要包含HTTP status code
这就是return的第二个值.
如果不返回多个值,那么可以返回response对象,用make_response().
有时候需要这样来进一步设置响应对象,如设置cookie
重定向,302 status
redirect(url)返回一个response对象.
abort函数,返回 404
2.6 flask扩展
在网站主程序中加入import
flask扩展都在flask.ext命名空间里
把程序实例作为参数传给构造函数.
以加入一个命令行选项的扩展作为例子.
加入flask-script扩展使其可以接受命令行选项,而不只是接收脚本中设置的参数.具体用法,在程序顶部加入:
from flask.ext.script import Manager.
host参数蛮有用,可以监听除了localhost之外的端口.
这里变化,gunicorn中对应的命令行也要变化。
运行服务器
./manage.py runserver