zoukankan      html  css  js  c++  java
  • 每日一“酷”之Cookie

    Cookie---Http Cookie

    作用:Cookie模块定义一些类来解析和创建HTTP cookie首部

    Cookie模块为大多数符合RFC 2109的cookie实现一个解析器。这个实现没有标准那么严格,因为,MSIE 3.0X并不支持整个标准。

    RFC 2109 HTTP状态管理机制

    1、  创建和设置Cookie

    可以用Cookie为机遇浏览器的应用实现状态管理,因此,Cookie通常由服务器设置,并由客户存储和返回。下面是一个创建cookie的最简单的例子。

    import Cookie
    c= Cookie.SmartCookie()
    c['mycookie'] = 'cookie_vale'
    print c

    运行结果:

    输出一个合法的Set-Cookie首部,可以作为HTTP响应的一部分传递到客户。

    2、  Morsel

    还可以控制cookie的气体方面,如到期时间、路径和域。实际上cookie的所有RFC都可以通过表示cookie值的Morsel对象来管理。

    RFC: Request For Comments (RFC),是一系列以编号排定的文件。文件收集了有关因特网相关资讯,以及UNIX和因特网社群的软件文件。目前RFC文件是由Internet Society(ISOC)所赞助发行。

    这个例子使用两个不同的方法设置所存储cookie的到期时间,其中一个将max-age谁知为秒,另一个expires设置为日期时间,到达这个日期时间就会丢弃这个cookie

    import Cookie
    import datetime
    
    def show_cookie(c):
        print c
        for key,morsel in c.iteritems():
            print 
            print 'key = ',morsel.key
            print '   value = ',morsel.value
            print '   coded_value = ',morsel.coded_value
            for name in morsel.keys():
                if morsel[name]:
                    print '  %s = %s' % (name,morsel[name])
    
    c = Cookie.SimpleCookie()
    
    c['encode_value_cookie'] = '"cookie_value"'
    c['encode_value_cookie']['comment'] = 'Value has escaped quotes'
    
    c['restricted_cookie'] = 'cookie_value'
    c['restricted_cookie']['path'] = '/sub/path'
    c['restricted_cookie']['domain'] = 'PyMotw'
    c['restricted_cookie']['secure'] = True
    
    c['with_max_age'] = 'expires in 5 minutes'
    c['with_max_age']['max-age'] = 300 #seconds
    
    c['expires_at_time'] = 'cookie_value'
    time_to_live = datetime.timedelta(hours = 1)
    expires = datetime.datetime(2009,2,14,18,30,14) + time_to_live
    
    expires_at_time = expires.strftime('%a, %d %b %Y %H:%M%S')
    c['expires_at_time']['expires'] = expires_at_time
    
    show_cookie(c)

    运行结果:

    Cookie和Morsel对象与字典类似。Morsel响应一个固定的键集。

    expires

    path

    comment

    domain

    max-age

    secure

    version

    Cookie实例的键是所存储各个cookie的名称。这个信息也可以从Morsel的键属性得到。

    3、  编码值

    cookie 首部要求对只编码,才能正确地解析

    import Cookie
    c = Cookie.SimpleCookie()
    c['interger'] = 5
    c['string_with_quotes'] = 'He said, "Hello, World"'
    for name in ['interger','string_with_quotes']:
        print c[name].key
        print '   %s' % c[name]
        print '   value = %r' % c[name].value
        print '   coded_value = %r' % c[name].coded_value
        print 

    运行结果:


      

    Morsel.value 是cookie的解码值,而Morsel.coded_value表示则用来将值传输到客户,这两个值都是串。如果保存到cookie的值不是串将会自动转换。

    4、  接收和解析Cookie首部

    一旦客户接收到Set-Cookie首部,在后续请求中它会使用一个Cookie首部把这些cookie返回到服务器。到来的Cookie首部串可能包含多个cookie值,由分号分隔(;)

    Cookie:interger = 5;string_with_quote = “He said,”Hello,World””

    取决于Web服务器和框架,可以直接从首部或HTTP_COOKIE环境标量的到cookie

    import Cookie
    HTTP_COOKIE = ';'.join([
                            r'integer = 5',
                            r'string_with_quotes = HelloWorld',
                            ])
    print 'From constructor:'
    c= Cookie.SimpleCookie(HTTP_COOKIE)
    print c
    print 
    print 'From load()'
    c = Cookie.SimpleCookie()
    c.load(HTTP_COOKIE)
    print c

    运行结果:

    要对其解码,实例化时可以将串(但不包括部首前缀)传递到SimpleCookie,或者使用load()方法

    5、  候选输出格式

    出了使用Set-Cookie首部外,服务器还可以提供JavaScript,向客户添加cookie. SimpleCookie和Morsel通过js_output()方法来提供JavaScript输出。

    import Cookie
    c = Cookie.SimpleCookie()
    c['mycookie'] = 'cookie_value'
    c['another_cookie'] = 'second value'
    print c.js_output()

    运行结果:

    6、  废弃的类

    所有这些例子都是用了SimpleCookie。Cookie模块还提供了另外两个类,SerialCookie 和 SmartCookie。 SerialCookie可以处理任何可pickle的值。SmartCookie能确定一个值是否需要接触pickle,或者这是否是一个简单值

    注:由于这两个类都是用pickle,它们存在潜在的安全漏洞。最好不要使用。更安全的做法是在服务器上存储状态, 并为客户同一个会话秘钥。

  • 相关阅读:
    MySQL 存储引擎 (一)
    mssql sqlserver if exists 用法大汇总
    mssql sqlserver 使用sql脚本实现相邻两条数据相减的方法分享
    mssql sqlserver 使用sql脚本获取字符串存在多少个网址(url地址)的方法分享
    mssql sqlserver sql脚本自动遍历重复生成指定表记录
    mssql sqlserver 使用sql脚本剔除数据中的tab、空格、回车等特殊字符的方法分享
    mssql sqlserver 使用SSMS运行sql脚本的六种方法分享
    mssql sqlserver isnull coalesce函数用法区别说明
    C# 当前 .NET SDK 不支持将 .NET Core 2.1 设置为目标。请将 .NET Core 2.0 或更低版本设置为目标,或使用支持 .NET Core 2.1 的 .NET SDK 版本。
    mssql sqlserver 三种数据表数据去重方法分享
  • 原文地址:https://www.cnblogs.com/victroy/p/4109078.html
Copyright © 2011-2022 走看看