1.初始化
from flask import Flask app = Flask(__name__)
flask类的构造函数只有一个必须指定的参数,即主模块或包的名字。
2.路由
http://python.jobbole.com/80956/
处理URL和函数之间关系的程序称为路由
定义路由的最简便方式,是使用app.route修饰器
@app.route('/') def index(): return '<h1>hello world</h1>'
URL和函数之间的关系在此表现为:比如不熟的域名为www.example.com,在浏览器中访问http://www.example.com后,会触发对应的index()函数。此函数的返回值称为相应,即客户端会接收到的内容。如果客户端是Web浏览器,相应就是现实给用户查看的文档。
index()这样的函数称为视图函数。
Flask支持动态URL,只需在route秀时期中使用特殊的句法。
@app.route('/user/<name>') def user(name): return '<h1>hello, %s!</h1>' % name
3.启动服务器
用run方法启动flask Web服务器:
if __name__ == '__main__': app.run(debug=True)
debug设为True进入调试模式
4.一个完整的程序
from flask import Flask app = Flask(__name__) @app.route('/') def index(): return '<h1>Hello World!</h1>' if __name__ == '__main__': app.run(debug=True)
包含动态路由
rom 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即可以看到一个使用了name动态参数生成的欢迎消息。
5.请求-响应循环
5.1程序和请求上下文
flask从客户端收到请求时,要让视图函数能访问一些对象。比如“请求对象”,它封装了客户端发送的HTTP请求。
Context 上下文全局变量:
- current_app 程序上下文 当前激活程序的程序实例
- g 程序上下文 处理请求时用作临时存储的对象。每次请求都会重设这个变量
- request 请求上下文 请求对象,封装了客户端发出的HTTP请求中的内容
- session 请求上下文 用户会话,用于存储请求之间需要“记住”的值的词典
Flask使用了上下文临时把某些对象变为全局可访问。
flask在分发请求之前激活(推送)程序和请求上下文,请求处理完成后再将其删除。程序上下文被激活(推送)后,就可以在线程中更实用current_app和g变量,请求上下文被推送后就可以使用request和session变量。如果使用这些变量时,没有激活程序上下文或请求上下文,就会单只错误。
5.2请求调度
程序收到客户端发来的请求后,要找到对应的处理该请求的视图函数。flask会在程序的URL映射中查找请求的URL。URL映射是URL和试图函数之间的对应关系。flask使用app.route修饰器或者非修饰器形式的app.add_url_rule()生成映射。
查看flask程序中的URL映射:
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添加的特殊路由,用于访问静态文件
5.3请求钩子
关于钩子的解释:http://blog.csdn.net/qq_28877125/article/details/77683720
- before_first_request • :注册一个函数,在处理第一个请求之前运行。
- before_request • :注册一个函数,在每次视图函数执行之前运行。
- after_request • :注册一个函数,如果没有未处理的异常抛出,在每次请求之后运行。
- teardown_request • :注册一个函数,即使有未处理的异常抛出,也在每次请求之后运行。
5.4响应
flask调用视图函数后,会将返回值作为响应的内容。大多情况下,响应就是个简单的字符串,作为HTML页面回送客户端。HTTP的状态码为200时,表明请求成功。
下述例子的视图函数会返回一个400的状态码,表示请求无效。
@app.route('/') def index(): return '<h1>Bad Request</h1>', 400
视图函数返回的响应还可接受第三个参数,这是一个由收不(header)组成的字典。
如果不想返回由1个、2个或3个值组成的元组,flask试图函数还可以返回Response对象。make_response对象可以接受1个、2个或3个参数(和视图函数的返回值一样,即 (html, 状态码,header)),并返回一个Response对象。
下例创建了一个相应对象,然后设置了cookie:
from flask import make_response @app.route('/') def index(): response = make_response('<h1>This document carries a cookie!</h1>', 200) response.set_cookie('answer', '42') return response
有一种名为重定向的特殊响应类型。重定向响应没有页面文档,只告诉浏览器一个新地址用以加载新页面。重定向经常在Web表单中使用。
重定向经常使用302状态码表示,指向的地址油Location首部提供。flask提供了redirect()辅助函数,用于生成这种响应:
from flask import redirect @app.route('/') def index(): return redirect('http://www.example.com')
重定向通常和url_for()一起用
@app.route('/') def index(): return 'Hello World!' @app.route('/login/') #这样即使改成@app.route('/fsdaf/')也不会影响 def login(): return '登录页面' @app.route('/question/<is_login>') def question(is_login): if is_login == '1':#如果已登录,进入问答页面 return '这是问答页面' else:#如果未登录,重定向到登录页面 return redirect(url_for('login'))
还有一种特殊的响应由abort函数生成,用于处理错误。在下例中,如果URL中动态参数id对应的用户不存在就返回状态码404:
from flask import abort @app.route('/user/<id>') def getuser(id): user = load_user(id) if not user: abort(404) return /<h1Hello, %s</h1>' % user.name
6.flask拓展
flask是可拓展的。
来源:https://www.cnblogs.com/betterluo/p/8456006.html