1.Cookie
我们都知道HTTP协议是无状态的请求协议,用户这次访问和下一次访问都是新的请求,它们之间是没任何关系的。但是我们需要知道上一次访问用户做了什么操作,就需要用到cookie。cookie是网站以键值对格式存储在浏览器中的一段纯文本信息,用于实现用户跟踪。cookie是基于域安全的 我们通过set_cookie方法设置cookie
from flask import Flask, render_template, make_response
app = Flask(__name__)
@app.route('/setcookie', methods=['GET', 'POST']) # 支持get、post请求
def setcookie(): # 视图函数
resp = make_response(render_template('cookie.html')) # 显式转换成HttpResponse对象
resp.set_cookie('nickname', 'laowang') # 设置cookie
resp.set_cookie('age', "12") # 设置cookie
return resp
app.config['DEBUG'] = True
if __name__ == '__main__':
# 0.0.0.0代表任何能代表这台机器的地址都可以访问
app.run(host='0.0.0.0', port=5000) # 运行程序
我们已经浏览器写入了如下信息,当我们下一次请求的时候,会自动把本地的cookie传给后台。 我们通过HttpReqeust对象把我们浏览器的cookies取到,我们新写一个视图把cookie取到:
@app.route('/getcookie', methods=['GET', 'POST']) # 支持get、post请求
def getcookie(): # 视图函数
nickname = request.cookies.get('nickname')
age = request.cookies.get('age')
return 'nickname=%s age=%s' % (nickname, age)
过期时间:
cookie是有过期时间的,当我们设置cookie的时候可以直接给cookie设置过期时间,有如下几种设置方法:
max_age是一个整数,表示在指定秒数后过期。
expires是一个datetime或timedelta对象,会话将在这个指定的日期/时间过期。
max_age与expires二选一。
如果不指定过期时间,在关闭浏览器时cookie会过期。
from flask import Flask, request, render_template, make_response
from datetime import datetime
app = Flask(__name__)
@app.route('/setcookie', methods=['GET', 'POST']) # 支持get、post请求
def setcookie(): # 视图函数
resp = make_response(render_template('cookie.html')) # 显式转换成HttpResponse对象
resp.set_cookie('nickname', 'laowang', max_age=3600) # 设置cookie 3600秒过期
resp.set_cookie('age', "12", expires=datetime(2019, 3, 18)) # 设置cookie,2019年3月18后过期
return resp
@app.route('/getcookie', methods=['GET', 'POST']) # 支持get、post请求
def getcookie(): # 视图函数
nickname = request.cookies.get('nickname')
age = request.cookies.get('age')
return 'nickname=%s age=%s' % (nickname, age)
app.config['DEBUG'] = True
if __name__ == '__main__':
# 0.0.0.0代表任何能代表这台机器的地址都可以访问
app.run(host='0.0.0.0', port=5000) # 运行程序
删除Cookie 我们可以通过delete_cookie方法删除cookie
@app.route('/delcookie', methods=['GET', 'POST']) # 支持get、post请求
def delcookie(): # 视图函数
res = make_response('删除cookie')
res.delete_cookie('nickname') # 删除的cookie的本质就是改变cookie的过期时间
return res
2.Session
上一篇,我们说到cookie,除了cookie外还有一个叫session的机制。session也是可以存储一些信息的。对于一些敏感、重要的信息,我们可以存储到session中。谁也不希望自己的余额、银行卡密码存到cookie当中。
cookie和session结合使用:web开发发展至今,cookie和session的使用已经出现了一些非常成熟的方案。在如今的市场或者企业里,一般有两种存储方式:
存储在服务端:通过cookie存储一个session_id,然后具体的数据则是保存在session中。如果用户已经登录,则服务器会在cookie中保存一个session_id,下次再次请求的时候,会把该session_id携带上来,服务器根据session_id在session库中获取用户的session数据。就能知道该用户到底是谁,以及之前保存的一些状态信息。这种专业术语叫做server side session。
将session数据加密,然后存储在cookie中。这种专业术语叫做client side session。flask采用的就是这种方式,但是也可以替换成其他形式。 。
a.每个网站都有登录功能,当登录成功,一段时间都不需要再登录了。那登录保持这个状态我们就可以通过session来搞定。 flask里面的session必须要设置SECRET_KEY
from flask import Flask, request, render_template, session, redirect
from datetime import datetime
app = Flask(__name__)
app.config['SECRET_KEY'] = 'laowangaigebi' # 设置session加密的密钥
@app.route('/login', methods=['GET', 'POST']) # 支持get、post请求
def login(): # 登录视图函数
# 模拟登录成功后把uid和username存到session里
session['uid'] = '123456'
session['username'] = 'laowang'
return redirect('/') # 登录成功后到首页
@app.route('/', methods=['GET', 'POST']) # 支持get、post请求
def index():
username = session.get('username') # 取session
if username:
return 'welcome %s' % username
else:
return '请登录'
app.config['DEBUG'] = True
if __name__ == '__main__':
# 0.0.0.0代表任何能代表这台机器的地址都可以访问
app.run(host='0.0.0.0', port=5000) # 运行程序
过期时间
如果没有设置session的有效期。那么默认就是浏览器关闭后过期。 如果设置session.permanent=True,那么就会默认在31天后过期。 如果不想在31天后过期,那么可以设置app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(hour=2)在两个小时后过期。
删除session
删除session中的值:也是类似字典。可以有三种方式删除session中的值。 session.pop(key) del session[key] session.clear()
b.把session存在服务端
我们可以利用flask-session来把session存在服务器,毕竟session的数据比较重要,存在浏览器中不安全。
flask-session支持把session存在各种数据库中
redis
memcached
filesystem
mongodb
sqlalchmey
我们最好把session存在内存级的redis数据库中,读写速度比较快
需要安装pip install flask-session /pip install redis
from flask import Flask, request, session
import redis
from flask_session import Session
# 初始化Session对象
f_session = Session()
app = Flask(__name__)
app.config['SECRET_KEY'] = 'laowangaigebi' # 加密的密钥
app.config['SESSION_USE_SIGNER'] = True # 是否对发送到浏览器上session的cookie值进行加密
app.config['SESSION_TYPE'] = 'redis' # session类型为redis
app.config['SESSION_KEY_PREFIX'] = 'session:' # 保存到session中的值的前缀
app.config['PERMANENT_SESSION_LIFETIME'] = 7200 # 失效时间 秒
app.config['SESSION_REDIS'] = redis.Redis(host='127.0.0.1', port='6379', db=4) # redis数据库连接
# 绑定flask的对象
f_session.init_app(app)
@app.route("/")
def index():
session['xingming'] = 'laozhao'
return '存session'
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000, debug=True)