您的位置:首页 > 其它

状态保持-session与cookie

2018-11-06 17:11 253 查看

状态保持

  • 因为 http 是一种无状态协议,浏览器请求服务器是无状态的。
  • 无状态:指一次用户请求时,浏览器、服务器无法知道之前这个用户做过什么,每次请求都是一次新的请求。
  • 无状态原因:浏览器与服务器是使用 socket 套接字进行通信的,服务器将请求结果返回给浏览器之后,会关闭当前的 socket 连接,而且服务器也会在处理页面完毕之后销毁页面对象。
  • 有时需要保持下来用户浏览的状态,比如用户是否登录过,浏览过哪些商品等
  • 实现状态保持主要有两种方式: 在客户端存储信息使用 Cookie
  • 在服务器端存储信息使用 Session

无状态协议:

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

Cookie

指某些网站为了辨别用户身份、进行会话跟踪而储存在用户本地的数据(通常经过加密)。

  • Cookie最早是网景公司的前雇员Lou Montulli在1993年3月的发明。
  • Cookie是由服务器端生成,发送给客户端浏览器,浏览器会将Cookie的key/value保存,下次请求同一网站时就发送该Cookie给服务器(前提是浏览器设置为启用cookie)。
  • Cookie的key/value可以由服务器端自己定义。
  • Cookie基于域名安全,不同域名的Cookie是不能互相访问的 如访问jd.com时向浏览器中写了Cookie信息,使用同一浏览器访问baidu.com时,无法访问到jd.com写的Cookie信息
  • 浏览器的同源策略
  • 当浏览器请求某网站时,会将本网站下所有Cookie信息提交给服务器,所以在request中可以读取Cookie信息
  • 服务器可以利用Cookies包含信息的任意性来筛选并经常性维护这些信息,以判断在HTTP传输中的状态。
  • 应用

    最典型的应用是判定注册用户是否已经登录网站,用户可能会得到提示,是否在下一次进入此网站时保留用户信息以便简化登录手续,这些都是Cookie的功用。

    Flask

    设置cookie

    可以通过make_response对象中的set_cookie方法来设置cookie。

    set_cookie(cookie名, value=cookie值, max_age=cookie有效期)
    • max_age 单位为秒,默认为None。
    • 如果是临时cookie,可将max_age设置为None。
    from flask imoprt Flask,make_response
    @app.route('/cookie')
    def set_cookie():
    response = make_response('this is to set cookie')
    response.set_cookie('username1', 'pig')  # 临时cookie
    response.set_cookie('username2', 'pppig', max_age=3600)  # 有效期一小时
    return response

    获取cookie

    from flask import Flask,request
    #获取cookie
    @app.route('/request')
    def resp_cookie():
    resp = request.cookies.get('username1')
    return resp

    Django

    设置cookie

    可以通过HttpResponse对象中的set_cookie方法来设置cookie。

    set_cookie(cookie名, value=cookie值, max_age=cookie有效期)
    • max_age 单位为秒,默认为None。
    • 如果是临时cookie,可将max_age设置为None。
    def demo_view(request):
    response = HttpResponse('ok')
    response.set_cookie('username1', 'pig')  # 临时cookie
    response.set_cookie('username2', 'pppig', max_age=3600)  # 有效期一小时
    return response

    获取cookie

    可以通过HttpRequest对象的COOKIES属性来读取本次请求携带的cookie值。request.COOKIES为字典类型。

    def demo_view(request):
    cookie1 = request.COOKIES.get('username1')
    print(cookie1)
    return HttpResponse('OK')

    Session

    Session:在计算机中,尤其是在网络应用中,称为“会话控制”。Session 对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。Session 对象最常见的一个用法就是存储用户的首选项。例如,如果用户指明不喜欢查看图形,就可以将该信息存储在 Session 对象中。注意 会话状态仅在支持 cookie 的浏览器中保留。

    • Session依赖于Cookie
    • 广义来讲: session是一种会话机制, 用于记录多次http请求之间的关系,关系就是状态数据,比如登录状态.
    • 狭义来讲: session是一种会话数据, 记录的状态数据, 比如登录之后记录的user_id等.

    Flask

    设置session

    实现状态保持中的session信息保存在redis数据库中

    from flask import Flask,session
    # 使用flask_session扩展包
    from flask_session import Session
    from redis import StrictRedis
    
    app = Flask(__name__)
    
    # 设置密钥
    app.config['SECRET_KEY'] = 'asdlkfjasl;dkfjqelfhelwqkt23l45j'
    # 使用Session类的配置信息
    app.config['SESSION_TYPE'] = 'redis'
    app.config['SESSION_REDIS'] = StrictRedis(host='127.0.0.1',port=6379)
    app.config['SESSION_USE_SIGNER'] = True
    # 使用Flask默认的config配置对象中的session有效期
    app.config['PERMANENT_SESSION_LIFETIME'] = 3600  # 秒
    
    # 使用Session类和程序实例进行关联
    Session(app)
    
    @app.route('/')
    def index():
    # 设置session
    session['year'] = '2019'
    return 'hello world'
    
    if __name__ == '__main__':
    app.run(debug=True)

    获取session

    session.get('year')

    Django

    在redis中保存session,需要引入第三方扩展,我们可以使用django-redis来解决。

    pip install django-redis

    在settings.py文件中做如下设置

    CACHES = {
    "default": {
    "BACKEND": "django_redis.cache.RedisCache",
    # 定义django中redis的位置
    "LOCATION": "redis://127.0.0.1:6379/1",
    "OPTIONS": {
    # django使用redis的默认客户端来进行操作.
    "CLIENT_CLASS": "django_redis.client.DefaultClient",
    }
    }
    }
    # 我们定义一个cache(本地缓存来存储信息,cahe指定的是redis)
    SESSION_ENGINE = "django.contrib.sessions.backends.cache"
    # 本地的session使用的本地缓存名称是'default', 这个名称就是上面我们配置的caches的名
    # 称"default"
    SESSION_CACHE_ALIAS = "default"

    设置session

    def set_session(request):
    request.session['one'] = '1'
    request.session['two'] = '2'
    return HttpResponse('保存session数据成功')

    设置session有效期

    request.session.set_expiry(value)
    • 如果value是一个整数,session将在value秒没有活动后过期。
    • 如果value为0,那么用户session的Cookie将在用户的浏览器关闭时过期。
    • 如果value为None,那么session有效期将采用系统默认值,默认为两周,可以通过在settings.py中设置SESSION_COOKIE_AGE来设置全局默认值。其中 SESSION_COOKIE_AGE的单位是以秒为单位的.

    获取session

    def get_session(request):
    one = request.session.get('one')
    two = request.session.get('two')
    text = 'one=%s, two=%s' % (one,two)
    return HttpResponse(text)

    以上内容仅供参考 -_- …为作者边学习,边摘抄和总计的内容

    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: