Django sessions 详解--part I: Cookies

所谓cookie其实就是有服务器端发送到客户端的属性字符串,而后客户端再返回给服务器端。它里面包含了一些用户的基本信息。cookie中的信息对客户端是不透名的,它只在服务器端使用。html

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

首先来看看在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')cookie

        self.end_headers()
        self.wfile.write(content)session

server = HTTPServer(('', 59900), MyRequestHandler)
server.serve_forever()性能

这是一个很是简单的使用cookie的例子,它展现了浏览器请求的路径信息。同时,它也设置了一个cookie,服务器的相应头部应该会包含相似下面的信息:orm

Set-Cookie: id=some_value_42server

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

相关文章
相关标签/搜索