zoukankan      html  css  js  c++  java
  • Python Flask,cookie,session ,设置、获取、删除

    使用Response类的set_cookie()方法可以设置cookie:

    Response.set_cookie(
        key,            //键
        value='',       //值
        max_age=None,   //秒为单位的cookie寿命,None表示http-only
        expires=None,   //失效时间,datetime对象或unix时间戳
        path='/',       //cookie的有效路径
        domain=None,    //cookie的有效域
        secure=None, 
        httponly=False)
    

    显然,如果要设置cookie,我们要自行构造Response对象,而不是交给Flask框架去完成这件事。

    示例:在访问首页/时设置cookie,并在访问/page2时读取cookie:

    @app.route('/')
    def index():
        rsp = make_response('go <a href="%s">page2</a>' % '/page2')
        rsp.set_cookie('user','JJJJJohnny')
        return rsp
    @app.route('/page2')
    def page2():
        user = request.cookies['user']
        return 'you are %s' % user

    会话/Session是为Web服务器建立状态的一个成熟模式。会话主要解决两个问题:

    访问者的标识问题

    服务器需要识别来自同一访问者的请求。这主要是通过浏览器的cookie实现的。 访问者在第一次访问服务器时,服务器在其cookie中设置一个唯一的ID号——会话ID。 这样,访问者后续对服务器的访问头中将自动包含该信息,服务器通过这个ID号,即可区 隔不同的访问者。

    Flask框架中,每当一个请求进来时会自动根据请求中cookie的会话ID创建 一个Session类的实例对象。你可以查看当前请求的cookie验证这一点(会话ID的键 默认为session):

    @app.route('/')
    def v_index():
        return request.cookies['session']

    访问者信息的记录问题

    服务器可以记录、提取指定访问者的历史信息。对每一个会话ID,服务端维护一个 数据上下文,这个数据运行在内存中,通常在变化时持久化到文件系统中或数据库中。

    在视图函数内,Flask提供了一个全局对象session,它始终等效于当前请求所对应的 Session类实例对象。Session类定义了get_item()方法和set_item()方法, 因此我们可以像使用Dict对象一样,通过[]操作符读取或设置会话变量:

    @app.route('/')
        if !session['user']:
            return redirect('/login')
        return 'some restricted for authorized users only'

    由于默认情况下,Flask将会话对象加密后存储在客户端的cookie里,因此必须要 为应用实例的secret_key属性配置一个加密种子才能使用session

    app.secret_key = 'sth. random as a encrypt key.'

    # coding:utf-8
     
    from flask import Flask, make_response, request
     
     
    app = Flask(__name__)
     
    # 设置cookie
    @app.route("/set_cookie")
    def set_cookie():
        resp = make_response("success")  # "success"是响应体
        # 设置cookie, 默认有效期是临时cookie,浏览器关闭就失效
        resp.set_cookie("Name", "Python")
        # max_age设置有效期,单位:秒
        resp.set_cookie("Name2", "Python1", max_age=3600)
        # 设置cookie其实就是通过设置响应头实现的。
        # resp.headers["Set-Cookie"] = "Name3=Python3; Expires=Sat, 18-Nov-2017 04:36:04 GMT; Max-Age=3600; Path=/"
        return resp
     
     
    # 获取cookie
    @app.route("/get_cookie")
    def get_cookie():
        c = request.cookies.get("Name")
        return c
     
     
    # 删除cookie
    @app.route("/delete_cookie")
    def delete_cookie():
        resp = make_response("del success")
        # 删除cookie
        resp.delete_cookie("Name1")
        return resp
     
     
    if __name__ == '__main__':
        app.run(debug=True)
     

    Flask学习笔记(十六) cookie与session

    一、了解概念
     
    http请求无状态

    在网站中,http请求是无状态的。也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户。

    cookie

    cookie的出现就是为了解决这个问题,cookie本质是一种存储机制,为了存储用户相关的信息。

    第一次登录后服务器返回一些数据(cookie)给浏览器,然后浏览器保存在本地,当该用户发送第二次请求的时候,就会自动的把上次请求存储的cookie数据自动的携带给服务器,服务器通过浏览器携带的数据就能判断当前用户是哪个了。

    第一次访问后,浏览器会自动保存服务器发过来的cookie数据,以便再次请求这个网站时让服务器"记住"用户!

    cookie特性

    cookie存储的数据量有限,不同的浏览器有不同的存储大小,但一般不超过4KB。因此使用cookie只能存储一些小量的数据。
    cookie有有效期:服务器可以设置cookie的有效期,以后浏览器会自动的清除过期的cookie。
    cookie有域名的概念:只有访问同一个域名,才会把之前相同域名返回的cookie携带给服务器。也就是说,访问谷歌的时候,不会把百度的cookie发送给谷歌。
     

    session

    我们不可能把用户的个人信息直接存储到cookie中,那样太不安全了! 为了解决这种问题,session就诞生了~

    不同的是,cookie是存储在本地浏览器,session是一个思路、一个概念、一个服务器存储授权信息的解决方案,不同的服务器,不同的框架,不同的语言有不同的实现。总之,它是为了解决cookie存储数据不安全的问题的。

    Flask中的session机制是将session信息加密,然后存储在cookie中!!!!

     session与cookie
    session是一个设计思想,通常和cookie结合使用。有session存储在服务器端和session存储到客户端两种方案。Flask中的session机制是将session信息加密,然后存储在cookie中!!!!

    关于cookie和session,就比如,你预定了一个旅店房间,首先你会得到一个凭证(cookie)。那天,你带着你的凭证(cookie)去旅店入住,旅店(服务器)老板先要拿着你的凭证(cookie)去核对信息(client side session),通过session信息找到你的预定房间,确认你的信息然后才能允许你入住,你可以在旅店(服务器)里搞一些事情。当某一天你的房间期限到了(session失效时),也就不能入住了。

    二、具体操作

    flask中操作cookie

    通过response对象来操作,可以在response返回之前,通过response.set_cookie来设置。通过键值对来读写cookie,具体参数可以查看函数原型。下面是示例代码

    from flask import Flask,Response,request
     
    #目的:练习cookie的使用
     
    app = Flask(__name__)   #实例化一个app
     
    #用户通过服务器get cookie的值(通过浏览器存储到本地)
    @app.route("/get_cookie")
    def get_cookie():
        reps = Response("获取cookie!!!")
        reps.set_cookie('username','hinzer')
        return reps
     
    #请求服务器删除cookie
    @app.route("/del_cookie")
    def del_cookie():
        reps = Response("删除cookie!!!")
        reps.delete_cookie("username")
        return reps
     
    #请求查询存储在cookie的用户信息
    @app.route("/")
    def index():
        username = request.cookies.get("username")
        if username:
            return username
        else:
            return u"没有获取到cookie"
     
    if __name__ == '__main__':
        app.run()

    通过浏览器来验证

    flask操作session:

    session是存储在服务器端的,操作与cookie类似。在flask中通过将session加密,然后存储到cookie中,保存到浏览器、看代码

    from flask import Flask,session
    import os
    from datetime import timedelta
     
    #目的:练习session的操作
     
    app = Flask(__name__)
    app.config['SECRET_KEY'] = os.urandom(24)                       #使用一组随机数对session进行加密
    app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(hours=2)   #修改session 过期时间 --> session.permanent = True
     
    #用户请求设置session
    @app.route('/get_session/')
    def get_session():
        session['username'] = 'hinzer'
        session['user_id'] = '123'
        # permanent:持久化(默认过期时间是31天)
        session.permanent = True
        # print(type(session))
        return '设置session!'
     
    #用户请求清除session
    @app.route('/del_session/')
    def delete_session():
        session.clear()
        return '清除session'
     
    #用户请求查询session
    @app.route('/')
    def index():
        username = session.get('username')
        user_id = session.get('user_id')
        print(user_id)
        return username or '没有session'
     
    if __name__ == '__main__':
        app.run()

    PS:由于http的请求无状态,我们可以通过程序上下文(临时存储对象),来保证一些重要的信息。比如session的key值,方便我们在程序中查询和处理。之后有机会会详细介绍一下、、

    https://blog.csdn.net/houyanhua1/article/details/85334869

  • 相关阅读:
    Java接口面面观
    Java之今天的异常处理了吗
    Java中自动装箱与拆箱详解
    java中this关键字解析
    Java语言实现机制
    Centos7 中 service iptables save 失效
    基于JQuery网页漂浮广告窗口Js详解
    JS日历
    js时间转换
    两种方法实现在HTML页面加载完毕后运行某个js
  • 原文地址:https://www.cnblogs.com/leijiangtao/p/4162946.html
Copyright © 2011-2022 走看看