1. 捕获异常的方法
-
HTTP 异常主动抛出
- abort方法,抛出一个给定状态代码的 HTTPException : abort(500)
-
捕获错误
- errorhandler 装饰器:注册一个错误处理程序,当程序抛出指定错误状态码的时候,就会调用该装饰器所装饰的方法
-
状态码的捕获
@app.route('/demo1')
def demo1():
# 主动抛出HTTP指定错误状态码
abort(404)
return 'demo1'
# 使用装饰器的形式去捕获指定的错误码和异常
@app.errorhandler(404)
def page_not_found(error):
return "唉,页面不见了~"
- 错误捕获
@app.route('/demo1')
def demo1():
# 主动抛出HTTP指定错误状态码
# abort(404)
a = 0
b = 1 / a
return 'demo1'
@app.route(ZeroDivisionError)
def zero_division_error(error):
return "除数不能为0"
2. 请求钩子函数
- before_first_request
- 在处理第一个请求前执行
- before_request
- 在每次请求前执行
- 如果在某修饰的函数中返回了一个响应,视图函数将不再被调用
- after_request
- 如果没有抛出错误,在每次请求后执行
- 接受一个参数:视图函数作出的响应
- 在此函数中可以对响应值在返回之前做最后一步修改处理
- 需要将参数中的响应在此参数中进行返回
- teardown_request
- 在每次请求后执行
- 接受一个参数:错误信息,如果有相关错误抛出
from flask import Flask
app = Flask(__name__)
@app.before_first_request
def before_first_request():
"""在第一次请求之前会访问该函数"""
print("before_first_request")
@app.before_request
def before_request():
"""在每次请求之前都会调用"""
print("before_request")
# 可以对一些非法的请求进行阻止
# if 如果ip在黑名单:
# return "你在~~~"
@app.after_request
def after_request(response):
"""在请求之后会调用,并且函数里面接受一个参数: 响应,还需要将响应进行返回"""
print('after_request')
# 可以在此函数中对响应数据做统一处理
return response
@app.teardown_request
def teardown_request(error):
"""在请求之后会执行,如果请求的函数报有异常,会把具体异常传入到此函数"""
print("teardown_request")
@app.route('/')
def index():
return 'index'
if __name__ == '__main__':
app.run(debug=True)
- 在第1次请求时的打印:
before_first_request
before_request
after_request
teardown_request
- 在第2次请求时的打印:
before_request
after_request
teardown_request
3. 获取请求参数的方法
request 就是flask中代表当前请求的 request 对象,其中一个请求上下文变量(理解成全局变量,在视图函数中直接使用可以取到当前本次请求)
- 获取上传的图片并保存到本地
@app.route('/', methods=['POST'])
def index():
pic = request.files.get('pic')
pic.save('./static/aaa.png')
return 'index'
4. 状态保持
- 因为 http 是一种无状态协议,浏览器请求服务器是无状态的。
- 无状态:指一次用户请求时,浏览器、服务器无法知道之前这个用户做过什么,每次请求都是一次新的请求。
- 无状态原因:浏览器与服务器是使用 socket 套接字进行通信的,服务器将请求结果返回给浏览器之后,会关闭当前的 socket 连接,而且服务器也会在处理页面完毕之后销毁页面对象。
- 有时需要保持下来用户浏览的状态,比如用户是否登录过,浏览过哪些商品等
- 实现状态保持主要有两种方式:
- 在客户端存储信息使用Cookie
- 在服务器端存储信息使用Session
Cookie
- Cookie:指某些网站为了辨别用户身份、进行会话跟踪而储存在用户本地的数据(通常经过加密)。
- 复数形式Cookies。
- Cookie最早是网景公司的前雇员Lou Montulli在1993年3月的发明。
- Cookie是由服务器端生成,发送给客户端浏览器,浏览器会将Cookie的key/value保存,下次请求同一网站时就发送该Cookie给服务器(前提是浏览器设置为启用cookie)。
- Cookie的key/value可以由服务器端自己定义。
设置cookie
from flask imoprt Flask,make_response
@app.route('/cookie')
def set_cookie():
resp = make_response('this is to set cookie')
resp.set_cookie('user_id', '1')
return resp
设置cookie 过期时间
@app.route('/cookie')
def set_cookie():
response = make_response('hello world')
response.set_cookie('user_id', '1', max_age=3600)
return response
获取cookie
from flask import Flask,request
#获取cookie
@app.route('/request')
def resp_cookie():
resp = request.cookies.get('user_id')
return resp
Session
- 对于敏感、重要的信息,建议要存储在服务器端,不能存储在浏览器中,如用户名、余额、等级、验证码等信息
- 在服务器端进行状态保持的方案就是Session
- Session依赖于Cookie
from flask import Flask, session
app = Flask(__name__)
# 设置 session 的话,需要配置 secret_key
app.config['SECRET_KEY'] = 'sdsfdfdf'
@app.route('/')
def index():
user_id = session['user_id']
user_name = session['user_name']
return '%s --- %s' % (user_id, user_name)
@app.route('/login')
def login():
# 假装检验成功
session['user_id'] = '1'
session['user_name'] = 'laowang'
return 'success'
@app.route('/logout')
def logout():
session.pop('user_id')
session.pop('user_name')
return 'success'
if __name__ == '__main__':
app.run(debug=True)
5. 上下文
请求上下文(request context)
- request
- 封装了HTTP请求的内容,针对的是http请求。举例:user = request.args.get(‘user’),获取的是get请求的参数。
- session
- 用来记录请求会话中的信息,针对的是用户信息。举例:session[‘name’] = user.id,可以记录用户信息。还可以通过session.get(‘name’)获取用户信息。
应用上下文(application context)
- current_app
- 应用程序上下文,用于存储应用程序中的变量,可以通过current_app.name打印当前app的名称,也可以在current_app中存储一些变量,例如:
- 应用的启动脚本是哪个文件,启动时指定了哪些参数
- 加载了哪些配置文件,导入了哪些配置
- 连了哪个数据库
- 有哪些public的工具类、常量
- 应用跑再哪个机器上,IP多少,内存多大
- 应用程序上下文,用于存储应用程序中的变量,可以通过current_app.name打印当前app的名称,也可以在current_app中存储一些变量,例如:
- g变量
- g 作为 flask 程序全局的一个临时变量,充当者中间媒介的作用,我们可以通过它传递一些数据,g 保存的是当前请求的全局变量,不同的请求会有不同的全局变量,通过不同的thread id区别
两者区别:
- 请求上下文:保存了客户端和服务器交互的数据
- 应用上下文:flask 应用程序运行过程中,保存的一些配置信息,比如程序名、数据库连接、应用信息等
6. Flask-Script 扩展
通过使用Flask-Script扩展,我们可以在Flask服务器启动的时候,通过命令行的方式传入参数。
from flask import Flask
from flask_script import Manager
app = Flask(__name__)
# 把 Manager 类和应用程序实例进行关联
manager = Manager(app)
@app.route('/')
def index():
return '床前明月光'
if __name__ == "__main__":
manager.run()
---------------------------------------------------END-----------------------------------------------
---------------------------------------------------END-----------------------------------------------