Windows环境
easy_install virtualenv
pip install flask
测试是否安装成功
import flask
初始化
所有Flask程序都必须创建一个程序实例。Web服务器使用一种名为Web服务器网关接口(Web Server Gateway Interface,WSGI)的协议,把接收自客户端的所有请求都转交给这个对象处理。
from flask import Flask
app = Flask(__name__)
Flask类的构造函数只有一个必须指定的参数,即程序主模块或包的名字。在大多数程序中,Python的 name变量就是所需的值。Flask用这个参数决定程序的根目录,以便稍后能够找到相对于程序根目录的资源文件位置。
路由和视图函数
处理URL和函数之间关系的程序称为路由
。
定义路由是使用程序实例提供的app.route
修饰器,把修饰的函数注册为路由。
下面例子中把index()
函数注册为程序根地址的处理程序。这个函数的返回值称为响应
,是客户端接收到的内容。
像index()
这样的函数称为视图函数
。
静态
@app.route('/')
def index():
return '<h1>Hello world!</h1>'
动态
@app.route('/user/<name>')
def user(name):
return '<h1>Hello ,%s!</h1>' % name
尖括号中的内容就是动态部分,任何能匹配静态部分的URL都会映射到这个路由上。路由中的静态部门默认使用字符串,不过也可以使用类型定义。Flask支持在路由中使用int, float, path
类型。path类型也是字符串,但不把斜线视作分隔符,而将其当作动态片段的一部分。
启动服务器
if __name__ == '__main__':
app.run(debug=True)
确保直接执行这个脚本时才启动开发Web服务器。
一个完整的程序
一个完整的Flask程序
# -*- coding: utf-8 -*-
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return '<h1>Hello world!</h1>'
if __name__ == '__main__':
app.run(debug=True)
浏览器输入
http://127.0.0.1:5000/
包含动态路由的程序
# -*- coding: utf-8 -*-
from flask import Flask
app = Flask(__name__)
@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__':
app.run(debug=True)
浏览器输入
http://127.0.0.1:5000/user/Dave
请求-响应循环
程序和请求上下文
Flask使用上下文临时把某些对象变为全局可访问。
from flask import request
@app.route('/')
def index():
user_agent=request.headers.get('User-Agent')
return '<p>Your browser is %s</p>' % user_agent
Flask使用上下文让特定的变量在一个线程中全局可访问,与此同时却不会干扰其他线程。
Flask中有两种上下文:程序上下文和请求上下文。
变量名 | 上下文 | 说明 |
---|---|---|
current_app | 程序上下文 | 当前激活程序的程序实例 |
g | 程序上下文 | 处理请求时用作临时存储的对象。每次请求都会重设这个变量 |
request | 请求上下文 | 请求对象,封装了客户端发出的HTTP请求中的内容 |
session | 请求上下文 | 用户会话,用于存储请求之间需要“记住”的值的字典 |
Flask在分发请求之前激活(或推送)程序和请求上下文,请求处理完成后再将其删除。程序上下文被推送后,就可以在线程中使用current_ap
p和g
变量。类似的,请求上下文被推送后,就可以使用request
和session
变量。如果使用这些变量时我们没有激活程序上下文或请求上下文,就会导致错误。
请求调度
Flask会在程序的URL映射中查找请求的URL。URL映射是URL和视图函数之间的对应关系。Flask使用app.route
修饰器或者非修饰器形式的app.add_url_rule()
生成映射。
查看程序URL映射
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>])
/
和/user/<name>
路由在程序中使用app.route
修饰器定义。/static/<filename>
路由是Flask添加的特殊路由,用于访问静态文件。
URL映射中的HEAD, OPTIONS, GET
是请求方法,由路由进行处理。
请求钩子
Flask提供了注册通用函数的功能,注册功能可在请求被分发到视图函数之前或之后调用。
请求钩子使用修饰器实现。
before_first_request 注册一个函数,在处理第一个请求之前运行。
before_request 注册一个函数,在每次请求之前运行。
after_request 注册一个函数,如果没有未处理的异常抛出,在每次请求之后运行。
teardown_request 注册一个函数,即使有未处理的异常抛出,也在每次请求之后运行。
在请求钩子函数和视图函数之间共享数据一般使用上下文全局变量g。
响应
如果视图函数返回的响应需要使用不同的状态码,可以把数字代码作为第二个返回值,添加到相应文本中。
请求无效
@app.route('/')
def index():
return '<h1>Bad Request</h1>', 400
设置cookie
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
重定向
有一种名为重定向的特殊响应类型。这种响应没有页面文档,只告诉浏览器一个新地址用以加载页面。
重定向经常使用302状态码表示,指向的地址由Location
首部提供。
from flask import redirect
@app.route('/')
def index():
return redirect('http://www.example.com')
abort函数——处理错误
from flask import abort
@app.route('/user/<id>')
def get_user(id):
user = load_user(id)
if not user:
abort(404)
return '<h1>Hello ,%s!</h1>' % user.name
abort
不会把控制权交还给调用它的函数,而是抛出异常把控制权交给Web服务器。
网友评论