• 4.flask框架-http会话控制(cookie和session)


    一、http会话控制

    1.1 会话简介

    所谓的会话,就是客户端浏览器和服务端网站之间一次完整的交互过程.

    会话的开始是在用户通过浏览器第一次访问服务端网站开始.

    会话的结束时在用户通过关闭浏览器以后,与服务端断开.

    所谓的会话控制,就是在客户端浏览器和服务端网站之间,进行多次http请求响应之间,记录、跟踪和识别用户的信息而已。

    因为 http 是一种无状态协议,浏览器请求服务器是无状态的。

    1.2 采用会话控制原因

    无状态:指一次用户请求时,浏览器、服务器无法知道之前这个用户做过什么,每次请求都是一次新的请求。

    无状态原因:浏览器与服务器是使用 socket 套接字进行通信的,服务器将请求结果返回给浏览器之后,会关闭当前的 socket 连接,而且服务器也会在处理页面完毕之后销毁页面对象。

    有时需要保持下来用户浏览的状态,比如用户是否登录过,浏览过哪些商品等

    实现状态保持主要有两种方式:

    • 在客户端存储信息使用Cookie,token[jwt,oauth]

    • 在服务器端存储信息使用Session

    1.3 token 介绍

    token是一种用户身份认证信息的技术,一般我们称之为:Token认证,翻译中文:token一般叫令牌;
    本质就是一个经过特殊处理的字符串,往往在字符串内部隐藏着识别用户身份信息的关键内容。一般开发中,token往往都是以识别用户身份为目的来使用的。

    一般使用情况下,token会以用户身份信息,当前事件戳,随机数等因子构成的。当然,更多情况下,token一般分三段:"头部.载荷.签证"
    像实际开发中,我们一般说的jwt,csrf等等场景里面的token都是这一类的。

    二 、Cookie

    2.1 cookie 介绍

    Cookie是由服务器端生成,发送给客户端浏览器,浏览器会自动将Cookie的key/value保存,下次请求同一网站时就发送该Cookie给服务器(前提是浏览器设置为启用cookie)。Cookie的key/value可以由服务器端自己定义。

    使用场景: 登录状态, 浏览历史, 网站足迹, 购物车 [不登录也可以使用购物车]

    Cookie是存储在浏览器中的一段纯文本信息,建议不要存储敏感信息如密码,因为电脑上的浏览器可能被其它人使用

    Cookie基于域名安全,不同域名的Cookie是不能互相访问的

    例如:访问oldboyedu.com时向浏览器中写了Cookie信息,使用同一浏览器访问baidu.com时,无法访问到oldboyedu写的Cookie信息

    浏览器的同源策略针对cookie也有限制作用.

    当浏览器请求某网站时,会将本网站下所有Cookie信息提交给服务器,所以在request中可以读取Cookie信息

    2.2 cookie操作

    设置cookie需要通过flask的Response响应对象来进行设置,由响应对象会提供了方法set_cookie给我们可以快速设置cookie信息

    from flask import Flask,make_response,request
    
    app = Flask(__name__)
    
    #设置cookie
    @app.route('/set_cookie')
    def set_cookie():
        response = make_response('set cookie')
        response.set_cookie('age', '19') # 过期时间是会话期,关闭浏览器以后,自动删除
        response.set_cookie('username', 'xiaoming', max_age=3600) # 在指定max_age时间以后,才会自动删除
        return response
    
    #获取cookie
    @app.route('/get_cookie')
    def get_cookie():
        # 获取客户端发送过来的cookie要通过request.cookies来完成
        # request.cookies 获取全部cookie
        username = request.cookies.get('username')
        age = request.cookies.get('age')
        return f"username={username}&age={age}"
    
    #删除cookie
    @app.route("/del_cookie")
    def del_cookie():
        # 删除cookie,cookie的删除必须要通过response对当前cookie设置无效的值或者过期的有效时间,让浏览器自动删除
        response = make_response("del cookie")
        response.set_cookie("username","",expires=0)
        return response
    
    if __name__ == '__main__':
        app.run(host="0.0.0.0",port=5000,debug=True)

    三、Session

    3.1 session 简介

    对于敏感、重要的信息,建议要存储在服务器端,不能存储在浏览器中,如用户名、余额、等级、验证码等信息

    在服务器端进行状态保持的方案就是Session

    Session依赖于Cookie,session的ID一般默认通过cookie来保存到客户端。

    flask中的session需要加密,所以使用session之前必须配置SECRET_KEY选项,否则报错.

    session的有效期默认是会话期,会话结束了,session就废弃了

     

    注:如果将来希望session的生命周期延长,可以通过修改cookie中的sessionID来完成配置。

     

    3.2 session操作

    from flask import Flask,session
    
    app = Flask(__name__)
    
    class Config(object):
        # 使用session之前,必须先设置秘钥
        SECRET_KEY = "123903tklasdlkas@"
    app.config.from_object(Config)
    
    #设置session数据
    @app.route('/set_session')
    def set_session():
        """设置session数据"""
        session["uname"] = "xiaoming"
        session["age"] = 13
        session["book_list"] = [{"title":"book_name"},{"title":"book_name"}]
        return "set_session"
    
    #获取session数据
    @app.route('/get_session')
    def get_session():
        """获取session数据"""
        print(session.get("uname"))
        print(session.get("age"))
        print(session.get("book_list"))
        return "get_session"
    
    #删除session数据
    @app.route('/del_session')
    def del_session():
        """删除session数据"""
        if session.get("uname"):
            del session["uname"]
        return "ok"
    
    
    if __name__ == '__main__':
        app.run(host="0.0.0.0",port=5000,debug=True)

     

     

     

     

     

  • 相关阅读:
    MySQL Case When 用法
    Delphi磁性窗口
    一个灵巧的Delphi多播实事件现方案.
    Delphi bpl 插件框架
    Win7下超级管理员创建普通权限任务
    Delphi 插件(Plugins)创建、调试与使用应用程序扩展
    Dll中导出类Delphi实战
    让你的程序支持插件
    构造一个通用的回调Thunk.(把回调函数指向对象的方法的办法)
    打造类.NET带垃圾回收功能的Delphi版GDIPlus
  • 原文地址:https://www.cnblogs.com/yj0405/p/14797494.html
Copyright © 2020-2023  润新知