码迷,mamicode.com
首页 > 其他好文 > 详细

每日一“酷”之Cookie

时间:2014-11-19 22:01:44      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   ar   color   使用   sp   java   

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

运行结果:

bubuko.com,布布扣

输出一个合法的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)

运行结果:
bubuko.com,布布扣

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 

运行结果:

bubuko.com,布布扣
  

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([
                        rinteger = 5,
                        rstring_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

运行结果:
bubuko.com,布布扣

要对其解码,实例化时可以将串(但不包括部首前缀)传递到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()

运行结果:

bubuko.com,布布扣

6、  废弃的类

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

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

每日一“酷”之Cookie

标签:style   blog   http   io   ar   color   使用   sp   java   

原文地址:http://www.cnblogs.com/victroy/p/4109078.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!