• Flask基础(10)-->http的无状态协议解决办法一(客户端cookie)


    http的无状态协议

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

    什么是无状态?

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

    无状态协议:

    1. 协议对于事务处理没有记忆能力
    2. 对于同一个url的请求没有上下文的关系
    3. 每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求是无直接联系的,它不会受前面的请求赢啊情况直接影响,也不会影响后面的请求应答情况。
    4. 服务器中没有保存客户端的状态,客户端必须每次带上自己的状态去请求服务器。

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

    那么,有时候我们也需要保持用户的浏览状态,比如,用户是否登录过,浏览过哪些商品等。

    举个例子说明一下什么是有状态和无状态:

    怎么实现状态保持呢?

    • 在客户端存储信息使用cookie
    • 在服务器端存储信息使用session

    cookie的交互流程



    如何设置和获取cookie呢?

    下面用代码简单演示一下:

    from flask import Flask
    from flask import make_response
    
    app = Flask(__name__)
    
    @app.route('/')
    def demo1():
        return 'demo1'
    
    @app.route("/login")
    def login():
        # 默认账号和密码都是正确的
        response = make_response("hellow")
        return response
    
    
    if __name__ == '__main__':
        app.run(debug = True)

    通过make_response(“响应体”)创建response响应对象. 然后返回.

    与直接return “响应体” 是一样的.

    但是这里我们需要用到response响应对象,去设置cookie,所以需要这样写.

    设置cookie

    from flask import Flask
    from flask import make_response
    
    app = Flask(__name__)
    
    @app.route('/')
    def demo1():
        return 'demo1'
    
    @app.route("/login")
    def login():
        # 默认账号和密码都是正确的
        response = make_response("hellow")
        # 设置cookie
        response.set_cookie("user_id","1")
        response.set_cookie("user_name","laowang")
        return response
    
    
    if __name__ == '__main__':
        app.run(debug = True)

    访问login之后,如果此时我们再访问当前网站的任何url,浏览器都会通过request携带cookie,传递给服务器.

    获取cookie

    我们另外写一个视图函数来显示获取cookie

    from flask import Flask
    from flask import make_response
    from flask import request
    
    app = Flask(__name__)
    
    @app.route('/')
    def demo1():
        return 'demo1'
    
    @app.route("/login")
    def login():
        # 默认账号和密码都是正确的
        response = make_response("hellow")
        # 设置cookie
        response.set_cookie("user_id","1")
        response.set_cookie("user_name","laowang")
        return response
    
    @app.route("/get_cookie")
    def get_cookie():
        """获取cookie"""
        user_id = request.cookies.get("user_id")
        user_name = request.cookies.get("user_name")
        return "user_id=%s>>>>>> user_name=%s"%(user_id,user_name)

    if __name__ == '__main__': app.run(debug = True)

    通过上面分别访问/login>>>>>>/>>>>>>/get_cookie可以看出,cookie已经能够被浏览器保存记录,并且可以在站内各个页面进行传递

    cookie的过期时间和删除操作

    cookie作为客户端保存的数据,相对来说不是十分安全,因为你登录浏览过一个网站之后,过一会也可能别人会用你的浏览器,这时候你保存的cookie可能就会被别人利用。

    设置cookie的有效时长,超过这个时间,cookie自动销毁

    @app.route("/login")
    def login():
        # 默认账号和密码都是正确的
        response = make_response("hellow")
        # 设置cookie
        response.set_cookie("user_id","1",max_age=3600) # 单位:秒
        response.set_cookie("user_name","laowang",max_age=3600)
        return response

    退出登录之后,主动销毁cookie

    @app.route('/logout')
    def logout(): #销毁cookie
        response = make_response("quit success")
        response.delete_cookie("user_id")
        response.delete_cookie("user_name")
        return response

    此时,其实我们发现cookie并没有删除,而是将过期时间=创建时间,即:max_age=0

    这样的话,cookie就失去了它的功能作用。那么我们也认为cookie被删除了。

     

  • 相关阅读:
    HttpWebRequest、HttpWebResponse简单Demo
    向虚拟机发短信(android SMS 调试)
    双系统时间相关8小时
    电脑开机报警声
    Windows Live Writer 代码插件
    配置Linux防火墙
    配置yum源方法,以及失效时的处理
    xp系统下硬盘安装centos6.5
    Android 四大组件 与 MVC 架构模式
    elasticsearch GIS空间查询问题解决
  • 原文地址:https://www.cnblogs.com/888888CN/p/9476067.html
Copyright © 2020-2023  润新知