您的位置:首页 > 编程语言 > Go语言

Django sessions 详解--part I: Cookies

2012-11-02 10:32 169 查看

所谓cookie其实就是有服务器端发送到客户端的属性字符串,

然后客户端再返回给服务器端。它里面包含了一些用户的基本信息。

cookie中的信息对客户端是不透名的,它只在服务器端使用。

下面,我们来看看在Django中使用cookie。


首先来看看在python中使用cookie

from BaseHTTPServer import HTTPServer

from SimpleHTTPServer import SimpleHTTPRequestHandler

import Cookie

class MyRequestHandler(SimpleHTTPRequestHandler):

def do_GET(self):

content = "<html><body>Path is: %s</body></html>" % self.path

self.send_response(200)

self.send_header('Content-type', 'text/html')

self.send_header('Content-length', str(len(content)))

cookie = Cookie.SimpleCookie()

cookie['id'] = 'some_value_42'

self.wfile.write(cookie.output())

self.wfile.write('\r\n')

self.end_headers()

self.wfile.write(content)

server = HTTPServer(('', 59900), MyRequestHandler)

server.serve_forever()

这是一个非常简单的使用cookie的例子,它展示了浏览器请求的路径信息。

同时,它也设置了一个cookie,服务器的相应头部应该会包含类似下面的信息:

Set-Cookie: id=some_value_42

python中的cookie模块提供了load方法用来解析cookie,这里就不再赘述。

下面来看看在Django中的cookie。

Django中的cookie设置比较烦琐,下面的方法展示了检测一个httprequest中是否有cookie,

如果没有服务器会返回一个cookie给浏览器,以便下次访问中使用它:

def test_cookie(request):

if 'id' in request.COOKIES:

cookie_id = request.COOKIES['id']

return HttpResponse('Got cookie with id=%s' % cookie_id)

else:

resp = HttpResponse('No id cookie! Sending cookie to client')

resp.set_cookie('id', 'some_value_99')

return resp

从上可以看出cookie被设置在一个httprequest中的类dict属性中,我们可以直接访问它。


Django中cookie的执行

Django的应用通常都是通过WSGI部署的,所以我们重点看看WSGI后台上的执行。

以Django1.3为例,WSGIRequest(继承自http.Request)类中,

我们可以看到cookie被设置成隐藏属性存放在self._cookies,如下:

def _get_cookies(self):

if not hasattr(self, '_cookies'):

self._cookies = http.parse_cookie(self.environ.get('HTTP_COOKIE', ''))

return self._cookies

每个WSGI specification实例都有cookie属性,但并非每个请求都需要cookie,

所以在不许要cookie的时候,我们就不需要对它进行解析。

上面的代码中我们提到一个方法:http.parse_cookie,它又是什么?

它是 Django’s HTTP module一个通用方法

def parse_cookie(cookie):

if cookie == '':

return {}

if not isinstance(cookie, Cookie.BaseCookie):

try:

c = SimpleCookie()

c.load(cookie, ignore_parse_errors=True)

except Cookie.CookieError:

# Invalid cookie

return {}

else:

c = cookie

cookiedict = {}

for key in c.keys():

cookiedict[key] = c.get(key).value

return cookiedict

它就是通过标准库中的Cookie模块来解析cookie的。

在一个httpresponse中设置cookie要通过set_cookie方法。

它会将设置的cookie写进self.cookies属性。

而WSGIHandler将会把相关的cookie信息添加在httpresponse的header中。


结束语

其实cookie在python和Django中的使用是非常简单的,但是处于安全性能的考虑,

还是不建议直接在Django中使用cookie,而是推荐使用更高级的sessions。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: