cookie模块学习

Cookie模块定义了一些类用来解析和创建HTTP cookie头部字段。

1.创建和设置Cookie

Cookie通常由服务器端来设置,并由客户存储和返回。

import Cookie

c = Cookie.SimpleCookie()
c["name"] = "jim"
print c.output()

输出结果为:

Set-Cookie: name=jim

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

2.Morsel

还可以通过Cookie的Morsel对象来管理cookie的其他方面,比如到期时间,路径和域等。

import Cookie
import datetime

c = Cookie.SimpleCookie()
c["name"] = "jim"
c["name"]["comment"] = "some comment"
c["name"]["path"] = "/sub/path"
c["name"]["domain"] = "python"
c["name"]["secure"] = True
# 法一,通过max-age设置到期时间
c["name"]["max-age"] = 300
now = datetime.datetime.now()
expires = now + datetime.timedelta(hours=1)
expires_at_time = expires.strftime("%a, %d %b %Y %H:%M:%S")
# 法二,通过expires设置到期时间
c["name"]["expires"] = expires_at_time
print c

输出结果为

Set-Cookie: name=jim; Comment=some comment; Domain=python; expires=Fri, 21 Jul 2017 12:34:53; Max-Age=300; Path=/sub/path; secure

Cookie实例的键是所存储的各个cookie的名称,Morsel对象实际就是cookie名称对应的值,它与字典类似。

3.编码值

cookie首部需要对值编码,才能正确解析。

import Cookie

c = Cookie.SimpleCookie()
c["example"] = 'he said, "hello world "'
print c["example"].key
print c["example"].value
print c["example"].coded_value  

输出结果如下:

example
he said, "hello world "
"he said\054 \"hello world \""

由上可以看出,Morsel.value是cookie的解码值,而Morsel.coded_value表示用来将值传输到客户。

4.接收和解析Cookie首部

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

取决于服务器和框架,可以直接从首部或者HTTP_COOKIE环境变量得到cookie,而解码cookie可以通过将串传递给SimpleCookie或者使用load()方法来实现。

# coding:utf-8
import Cookie

HTTP_COOKIE = ";".join([r"name=jim", r"age=12"])

# 方法1
c1 = Cookie.SimpleCookie(HTTP_COOKIE)
print c1

# 方法2
c2 = Cookie.SimpleCookie()
c2.load(HTTP_COOKIE)
print c2

Cookie提供了三个不同的类SimpleCookieSerialCookieSmartCookie。它们的区别在于SimpleCookie只支持解析str类型的cookie,SerialCookie要求所有的值可序列化,SmartCookie两者都支持。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Golang语言社区

服务器端Go程序对长短链接的处理及运行参数的保存

对长、短连接的处理策略(模拟心跳) 作为一个可能会和很多Client进行通讯交互的Server,首先要保证的就是整个Server运行状态的稳定性,因此在和Cli...

4317
来自专栏Jackie技术随笔

基本TCP套接口编程

为了执行网络I/O,一个进程(无论是服务端还是客户端)必须做的第一件事情就是调用socket函数。

4006
来自专栏Netkiller

数据与应用程序间通信·UDP Socket

你是否想过当数据库中发生变化时,将变化内容通知到外面的应用程序。这样做的目的是 方便二次开发,例如你的软件第三方产品,你没有软件的源码,无法二次开发,这是你可以...

3526
来自专栏zhisheng

看透 Spring MVC 源代码分析与实践 —— 网站基础知识

网站架构及其演变过程 基础结构 网络传输分解方式: 标准的 OSI 参考模型 TCP/IP 参考模型 ? 海量数据的解决方案 缓存和页面静态化 缓存 通过...

3308
来自专栏xingoo, 一个梦想做发明家的程序员

【AngularJS】—— 7 模块化

AngularJS有几大特性,比如:   1 MVC 2 模块化   3 指令系统   4 双向数据绑定 那么本篇就来看看AngularJS的模块...

2035
来自专栏奔跑的蛙牛技术博客

Java并发知识点(2)

用new操作符创建一个新线程时如new Thread(r)  该线程还没有被运行,这意味着这个线程的状态是new。当一个线程处于新创建状态,程序还没有开始运行线...

892
来自专栏java学习

面试题13(一个具有生命的线程有哪些状态)

考点:考察求职者对线程的理解 出现频率:★★★ 【面试题解析】线程的状态表示线程在某时间段内进行的活动和将要进行的任务程有创建、就绪、运行、阻塞、死亡5种状态。...

3315
来自专栏技术之路

Http概述(一)

Http使用的是可靠的数据传输协议,因此即使数据来自地球的另一端,也能够确保数据在传输过程中不会被损坏或产生混乱。 这样用户在访问信息时就不用担心其完整性了。 ...

2055
来自专栏鸿的学习笔记

计算机网络整理

应用层(Application Layer) 传输层(Transport Layer) 网络层(Network Layer) 链接层(Link Layer) 实...

1111
来自专栏醒者呆

程序员必备课程——网络编程入门

关键字:互联网协议,网络分层,socket,TCP/IP协议,jdk源码,多线程,线程池,ExecutorService 本文的主要目的是面向程序员,所以...

5626

扫码关注云+社区

领取腾讯云代金券