Flask系列-程序基本结构
一、前言
感觉自己不写点什么记录下来的话就会忘掉,虽然写点什么也可能会忘掉,但可能会更有动力看下去这样子
- 使用的书:Flask Web开发
- 书中示例代码:https://github.com/miguelgrinberg/flasky.git
- 运行环境:PyCharm
二、程序的基本结构
1.一个最开始的程序
# -*- coding:utf-8 -*- from flask import Flask app = Flask(__name__) @app.route('/') #使用app.route修饰器,把修饰函数注册为路由 def index(): #index()这样的函数就叫视图函数 return '<h1>Hello World!<h1>' #@app.route('/user/<int::id>') int;float;path:字符串不把/视作分隔符 @app.route('/user/<name>') def user(name): return '<h1>Hello, %s!<h1>' %name if __name__ == '__main__': #debug=Ture启用调试模式 app.run(debug=True) #run方法启动Flask集成的开发Web服务器
2.请求
为避免大量非必要参数弄得搞乱视图函数,Flask使用上下文临时把某些对象变为全局可访问。
使用前需先激活程序上下文或请求上下文,处理完成后再删除
程序上下文:
- current_app:当前激活程序的程序实例
- g:处理请求时用作临时储存的对象;每次请求都会重设这个变量
请求上下文:
- request:请求对象,封装客户端发出的HTTP请求中的内容
- session:用户会话,用于存储请求之间需要“记住”的值的词典
虽然不太懂除了request其他的怎么用,但是书上说后面会讲到的......Flask使用上下文让特定的变量在一个线程中全局可访问,同时却不会干扰其他进程。
此时request被当作某线程中的全局变量:
# -*- coding:utf-8 -*- from flask import Flask from flask import request #引入 app = Flask(__name__) @app.route('/') def User_Agent(): user_agent = request.headers.get('User-Agent') return '<p>You brower is %s</p>' %user_agent if __name__ == '__main__': app.run(debug=True)
3.请求钩子
都先注册一个函数:
- before_first_request:在处理第一个请求之前运行
- before_request:在每次请求之前运行
- after_request:如果 无 未处理异常 抛出,在每次请求之后运行
- teardown_request:即使 有 未处理异常 抛出,也在每次请求后运行
在请求钩子函数和视图函数间一般通过上下文全局变量 g 共享数据
- before_first_request从数据库中加载已登陆用户,并将其保存到 g .user 中
- 随后调用视图函数时,视图函数再使用 g.user 获取用户
虽然有一点点懂,但是书上说后面会讲到的......
4.响应
大多数情况下,响应是一个简单的字符串,并作为HTML页面回送客户端
若视图函数返回的响应需使用不同状态码,可以把数字代码作为第二个返回值
@app.errorhandler(404) def page_not_found(e): return render_template('404.html'), 404
视图函数可返回 Response 对象:
make_sense() 可接受1~3个参数,并返回一个Response对象:
from flask import make_response @app.route('/') def index(): response = make_response('This document carries a cookie!') response.set_cookie('answer','42') return response
重定向 302:redirect()
from flask import redirect @app.route('/') def index(): return redirect('http://www.xxxx.com')
错误处理 :abort()
#如果URL中动态参数id对应的用户不存在,就返回404 from flask import abort @app.route('/user/<id>') def get_user(id): user = load_user(id) if not user: abort(404) return 'Hello, %s' %user,name