Flask中的Cookie和Session

1.Cookie

咱们都知道HTTP协议是无状态的请求协议,用户此次访问和下一次访问都是新的请求,它们之间是没任何关系的。可是咱们须要知道上一次访问用户作了什么操做,就须要用到cookie。cookie是网站以键值对格式存储在浏览器中的一段纯文本信息,用于实现用户跟踪。cookie是基于域安全的 咱们经过set_cookie方法设置cookiehtml

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取到:web

@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)

复制代码

过时时间:redis

cookie是有过时时间的,当咱们设置cookie的时候能够直接给cookie设置过时时间,有以下几种设置方法:sql

max_age是一个整数,表示在指定秒数后过时。mongodb

expires是一个datetime或timedelta对象,会话将在这个指定的日期/时间过时。数据库

max_age与expires二选一。flask

若是不指定过时时间,在关闭浏览器时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当中。bash

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)

复制代码
相关文章
相关标签/搜索