• 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中
  • 相关阅读:
    10 Unit Testing and Automation Tools and Libraries Java Programmers Should Learn
    nginx unit java 试用
    Oracle Trace文件生成及查看
    记录数过亿条的表数据维护-数据删除
    对于上千万甚至上亿的数据,如何正确的删除?
    怎么快速删除大数据量表
    如何启动或关闭oracle的归档(ARCHIVELOG)模式
    oracle清理归档日志(缓存)
    HTTP和HTTPS协议,看一篇就够了
    HTTP与HTTPS对访问速度(性能)的影响
  • 原文地址:https://www.cnblogs.com/aitree/p/14366943.html
Copyright © 2020-2023  润新知