[学习flask]1,整体初步认识

整体初步认识

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