请求钩子
为什么要有这个请求钩子出现呢?
在客户端和服务端的数据交互的过程中,有些准备工作或扫尾工作需要处理,比如
在请求开始时,建立数据库连接;
在请求开始时,根据需求进行权限校验;
在请求结束时,指定数据的交互格式;
为了让每个视图函数避免编写同样的代码,Flask提供了通用设施的功能,即请求钩子。
请求钩子是通过装饰器实现的,Flask支持如下四种请求钩子:
before_first_request(在处理第一个请求前执行)
brdore_request(在每次请求前执行,如果在某修饰函数中返回了一个响应,视图函数将不再被调用)
after_request(如果没有抛出异常,在每次请求后执行;接受一个参数:视图函数做出的响应(response);在此函数中可以对响应值在返回之前进行进一步的修改;需要将参数中的响应在此函数中返回)
teardown_request(在每次请求后执行;接收一个参数:错误信息(e)同errorhandler,如果有相关异常抛出)
注意:这个异常是指代码本身错误(代码中出现10/0)不执行,如果abort抛出异常了,after_request还是会执行。
状态保持
因为http是一种无状态的协议,基于套接字(socket),浏览器请求服务器是无状态的。无状态:就是指一次用户请求之后,浏览器服务器无法知道这个用户做过什么,每次请求都是一次新的请求。但是,我们在实际的开发过程中,需要记录用户是否登陆过,以及浏览过那些商品之类的需求。
实现状态保持有两种方式:
在客户端存储信息使用Cookie;
在服务器端存储信息使用Session;
两种都是基于键值对的字符串,服务器生成Cookie信息,都存储在浏览器当这个。而服务器生成Session信息,key存储在浏览器中,value存储在服务器中。
Cookie设置和获取:
from flask import Flask,make_response,request
app = Flask(__name__)
# Cookie有一个同源策略,百度给的京东拿不到。
# 设置Cookie
@app.route('/')
def index():
response = make_response('set cookie success')
# 设置Cookie,设置有效期,单位是秒。
response.set_cookie('name','wax',max_age = 360)
# 返回响应
return response
# 在浏览器的set_cookie:name = wax,path = / 这个路径path就是浏览器的这个cookie允许的域
# 获取Cookie
@app.route('/get')
def get_cookie():
name = request.cookies.get('name')
return name
if __name__ == '__main__':
app.run()
Session的设置和获取
from flask import Flask,session
app = Flask(__name__)
# 设置密钥
app.config['SECRET_KEY'] = 's9H/oDtK/s5gbddabV2aMjFb4AHrbNwR7nRl7y4WvDmZwDHdAFRsHw=='
# 设置Session,设置session要求会话安全。需要设置一个密钥。
@app.route('/')
def set_session():
session['name'] = 'wax'
return 'set session success'
if __name__ == '__main__':
app.run()
设置session的时候如何选择一个合适的密钥,如何去寻找这个合适的安全的字符串呢,使用base64这个编码工具:
import os,base64
a = os.urandom(40)
base64.b64encode(a)