Django sessions 详解--part I: Cookies
下面,我们来看看在Django中使用cookie。
首先来看看在python中使用cookie
from BaseHTTPServer import HTTPServer
from SimpleHTTPServer import SimpleHTTPRequestHandler
import Cookieclass 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。
# 作者微博:http://weibo.com/amaozhao
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。