zoukankan      html  css  js  c++  java
  • 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)

     

     

     

     

     

  • 相关阅读:
    swoole 安装方法 使用即时聊天
    git的介绍以及简单应用
    curl的应用
    linux下监听和同步代码配置
    mac skim 修改背景色
    php 编译安装的一个 configure 配置
    mac mysql error You must reset your password using ALTER USER statement before executing this statement.
    yii2 控制器里 action 大小写组合造成的路由问题
    warning : json_decode(): option JSON_BIGINT_AS_STRING not implemented in xxx
    redis 自启动脚本
  • 原文地址:https://www.cnblogs.com/yj0405/p/14797494.html
Copyright © 2011-2022 走看看