aitree

一、会话技术详细过程

         在浏览器中输入域名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中

分类:

技术点:

相关文章: