zoukankan      html  css  js  c++  java
  • 9.Flask Cookie和Session

    1.1.概念

    cookie:在网站中,http请求是无状态的。也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户。cookie的出现就是为了解决这个问题,第一次登录后服务器返回一些数据(cookie)给浏览器,然后浏览器保存在本地,当该用户发送第二次请求的时候,就会把上次请求存储的cookie数据自动的携带给服务器,服务器通过浏览器携带的数据就能判断当前是哪个用户了。cookie存储的数据量有限,不同的浏览器有不同的存储大小,但一般不超过4kb。因此使用cookie只能存储一些小量的数据。

    session:session和cookie的作用有点类似,都是为了存储用户相关的信息。不同的是,cookie是存储在本地浏览器,而session存储在服务器。存储在服务器的数据会更加安全,不容易被窃取。但存储在服务器也有一定的弊端,就是会占用服务器的资源,但现在服务器已经发展至今,存储一些session信息还是绰绰有余的。

    cookie和session结合使用:cookie和session的使用已经出现了一些非常成熟的方案。一般有两种存储方式

    • 存储在服务端:通过cookie存储一个session_id,然后具体的数据则保存在session中。如果用户已经登录,则服务器会在cookie中保存一个session_id,下次再请求的时候,会把该session_id携带上,服务器根据session_id在sesson库中获取用户的session数据。就能知道该用户到底是谁,以及之前保存的一些状态信息。这种专业术语叫做 server side session.
    • 将session数据加密,然后存储在cookie中。这种专业术语叫做 client side session。flask采用的就是这种方式,但是也可以替换成其它方式。

    1.2.设置cookie

    设置cookie:应该在Response的对象上设置。flask.Response对象上有一个set_cookie方法,可以通过这个方法来设置cookie信息。

    from flask import Flask,request,Response
    
    app = Flask(__name__)
    
    @app.route('/')
    def hello_world():
        resp = Response("服务器返回信息")
        #设置cookie,
        resp.set_cookie('username','derek')
        return resp
    
    if __name__ == '__main__':
        app.run()

    参数介绍:源码

     def set_cookie(self, key, value='', max_age=None, expires=None,
                       path='/', domain=None, secure=False, httponly=False,
                       samesite=None):
    • key:键
    • value:值
    • max_age:设置过期时间(秒)
    • expires:设置过期时间,时间戳的形式(1970离现在的时间)
    • path:当前主域名
    • domain:子域名

    1.3.删除cookie

    删除cookie,通过Response.delete_cookie方法,指定cookie的key,就可以删除cookie了

    @app.route('/del/')
    def delete_cookie():
        resp = Response("删除cookie")
        #设删除cookie,
        resp.delete_cookie('username')
        return resp

    1.4.设置cookie过期时间

    参数解释:

    • max_age:以秒为单位,距离现在多少秒后cookie会过期
    • expires:datetime类型,这个时间需要设置为格林尼治时间,也就是要距离北京少8个小时
    • 如果max_age和expires都设置了,那么这时候以max-age为标准
    • 如果没有指定过期时间,则默认为浏览器关闭后过期

    代码如下:

    @app.route('/')
    def hello_world():
        resp = Response("设置cookie")
        # 1.使用expires参数,就必须使用格林尼治时间
        # 通过expires参数设置有效期的时候,就要相对北京时间少8个小时,所有这里hours是16,
        # 如果直接days=31,就不准确了
        expires = datetime.now() + timedelta(days=30,hours=16)
        resp.set_cookie('username','derek',expires=expires)
        
        # 2.使用max_age参数设置过期时间(1分钟后后期)
        # resp.set_cookie('username','derek',max_age=60)
        return resp

    1.5. session

    flask操作session

    • 设置session:通过flask.session就可操作session了,操作session就跟操作字典是一样的。session['username'] = 'derek'
    • 获取session:也是类似字典,session.get('key')
    • 删除session:session.pop(key),删除指定的值;session.clear(),删除session中所有的值
    • 设置session有效期:如果没有设置session的有效期。那么默认就是浏览器关闭后过期。如果设置session.parmanent=True,那么就会默认31天后过期。如果不想在31天后过期,那么可以设置app.config['PERMANENT_SESSION_LIFETIME']= timedelta(hour=2),可以指定多久后过期(比如:2小时)。

    代码如下:

    from flask import Flask,session
    import os
    from datetime import timedelta
    
    app = Flask(__name__)
    app.config['SECRET_KEY'] = os.urandom(24)
    #自定义设置session的有效期
    app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(hours=2)
    
    @app.route('/')
    def index():
        # 设置session
        session['username'] = 'derek'
        # permanent:过期时间,默认为false,如果设置为True,则默认为31天之后过期
        # 可以通过app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(hours=2)
        # 来自定义过期时间,这样设置后,session.permanent = True的session有效期则为两个小时
        session.permanent = True
        return 'Hello World!'
    
    @app.route('/get_session/')
    def get_session():
        #获取session
        username = session.get('username')    # derek
        return username
    
    @app.route('/delete_session/')
    def delete_session():
        #删除session
        session.pop('username')    #删除指定的session
        # session.clear()          #删除所有session
        return '删除成功'
    
    if __name__ == '__main__':
        app.run(debug=True)
     
     
     
  • 相关阅读:
    257. Binary Tree Paths
    324. Wiggle Sort II
    315. Count of Smaller Numbers After Self
    350. Intersection of Two Arrays II
    295. Find Median from Data Stream
    289. Game of Life
    287. Find the Duplicate Number
    279. Perfect Squares
    384. Shuffle an Array
    E
  • 原文地址:https://www.cnblogs.com/gaidy/p/12087909.html
Copyright © 2011-2022 走看看