Flask—会话技术:cookie、session以及session持久化问题

一、会话技术详细过程

         在浏览器中输入域名url,会经过dns服务器将域名解析成ip返回后,浏览器发送request对象请求给服务器,服务器收到请求后创建一个session对象,该对象会有个session_key的值,服务器会将该值以set_cookie消息头的形式发送给浏览器,浏览器接收到后,会将session_key的变量定义为session_id,session_id会存储在cookie中,当浏览器再次访问时,就会携带着session_id去服务器找对应的数据。

二.Cookie

1.Cookie介绍

Cookie是一种客户端会话技术,所有数据存储在客户端,其是以key-value进行数据存储层,服务器中是不做任何存储。
其特性:

  1. 支持过期时间
       max_age 毫秒
       expries 具体日期
  2. 根据域名进行cookie存储
  3. 不能跨网站(域名)
  4. 不能跨浏览器
  5. 自动携带本网站的所有cookie

Cookie是服务器操作客户端的数据,通过Response进行操作。

2.Cookie登陆使用

设置cookie     response.set_cookie('username',username)
获取cookie     username = request.cookies.get('username','游客')
删除cookie     response.delete_cookie('username')

登录案例
(1)执行tologinCookie跳转到loginCookie的页面,再页面中输入名字,点击提交
(2)跳转到welcomeCookie页面,显示 欢迎xxx来到英雄联盟
(3)如果登陆进入到了welcomeCookie的页面,在欢迎xxx来到英雄联盟的下面有一个退出,点击退出之后,显示欢迎游客来到英雄联盟。
在视图函数中添加:

# 跳转到登陆的页面
@blue.route('/toLoginCookie/')
def toLoginCookie():
    return render_template('loginCookie.html') 

在模板中创建loginCookie.html文件

    #避免写硬代码,使用反向解析url_for
    <form action="{{ url_for('blue.loginCookie') }}" method="post">
        <input type="text" name="name">
        <button>提交</button>
    </form>

运行结果:
在这里插入图片描述
提交之后 执行的action的路由

@blue.route('/loginCookie/', methods=['get', 'post'])
def loginCookie():
    name = request.form.get('name')

    response = redirect(url_for('blue.welcomeCookie'))

    response.set_cookie('name', name)
    return response 
@blue.route(
'/welcomeCookie/') def welcomeCookie(): # get方法如果可以获取name值,那么就会得到name值;如果获取不到,那么就给默认值 name = request.cookies.get('name', '游客') return render_template('welcomeCookie.html', name=name)

在模板中创建welcomeCookie.html文件

 欢迎{{ name }}来到英雄联盟
    <br>
    {% if name == '游客' %}
            <a href="{{ url_for('blue.toLoginCookie') }}">登陆</a>
        {% else %}
            <a href="{{ url_for('blue.logout') }}">退出</a>
    {% endif %} 

运行结果:
在这里插入图片描述
点击退出之后,显示欢迎游客来到英雄联盟。

@blue.route('/logout/')
def logout():
    response = redirect(url_for('blue.welcomeCookie'))
#     清除cookie
    response.delete_cookie('name')

    return response

 

运行结果:
在这里插入图片描述

三.Session

1.Session介绍

session是一种服务端会话技术,其把所有数据存储在服务器中,默认存在服务器的内存中,其的存储结构也是key-value形式。

注意:
  单纯的使用session是会报错的,需要使用在__init__方法中配置app.config[‘SECRET_KEY’]=‘110’。
  django中的session默认做了数据持久化(存在了数据库中)

2.Session登陆使用

 设置    session['username'] = username
 获取    session.get('username')
 删除    resp.delete_cookie('session')  或者 session.pop('username') 

登陆案例,如cookie一样:
在views中:

@blue.route('/toLoginSession/')
def toLoginSession():
    return render_template('loginSession.html')

@blue.route('/loginSession/',methods=['get','post'])
def loginSession():
    name = request.form.get('name')
    session['name']=name
    return redirect(url_for('blue.welcomeSession'))

@blue.route('/welcomeSession/')
def welcomeSession():
    name = session.get('name','游客')
    return render_template('welcomeSession.html',name=name)

@blue.route('/logoutSession/')
def logoutSession():
    # session.pop('name')
    response = redirect(url_for('blue.welcomeSession'))
    # 删除cookie的key值叫做session
    response.delete_cookie('session')
    return response

创建loginSession.html文件:

<body>
    <form action="{{ url_for('blue.loginSession') }}" method="post">
        <input type="text" name="name">
        <button>提交</button>
    </form>
</body>

创建welcomeSession.html文件:

<body>
    欢迎{{ name }}光临
    <a href="{{ url_for('blue.logoutSession') }}">退出</a>
</body> 

运行结果:
在这里插入图片描述
如果出现上面的报错,那么可能就是你没有在init文件中添加app.config[‘SECRET_KEY’]=‘110’。(110:此数字不固定,可填你喜欢的数字)
添加之后,则会运行成功。

3.Session持久化问题

(1)持久化简介

1.django中对session做了持久化,存储在数据库中
2.flask中没有对默认session进行任何处理
   - flask-session 可以实现session的数据持久化
   - 可以持久化到各种位置,更推荐使用redis
   - 缓存在磁盘上的时候,管理磁盘文件使用lru, 最近最少使用原则

(2)持久化实现方案

a.安装flask-session
    pip install flask-session
b.初始化Session对象
    持久化的位置:配置init中 app.config[‘SESSION_TYPE’] = ‘redis’
c.如果指定的持久化的位置是redis,那么我们就需要依赖于redis的库,所以需要pip install redis
d.创建Sessin的对象(2种):
    (1) Sesssion(app=app)
    (2) session = Session()
      session.init_app(app=app)
e.需要配置SECRET_KEY=‘110’
    持久化的时候,是不需要写secret_key的,但是为了数据安全,强制性添加
f.存储到redis中的数据的前缀设置
    app.config[‘SESSION_KEY_PREFIX’]=‘flask’

flask的session的生存时间是31天,django的session生存时间是14天

cookie和session总结

  1. cookie: 客户端浏览器的缓存;session: 服务端服务器的缓存
  2. cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session
  3. session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie
  4. 可以考虑将登陆信息等重要信息存放为session,其他信息如果需要保留,可以放在cookie中
posted @ 2021-02-03 14:43  元小疯  阅读(472)  评论(0编辑  收藏  举报