Django sessions 详解

Stella981
• 阅读 653

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

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

首先来看看在python中使用cookie

from BaseHTTPServer import HTTPServer
from SimpleHTTPServer import SimpleHTTPRequestHandler
import Cookie

class MyRequestHandler(SimpleHTTPRequestHandler):
    def do_GET(self):
        content = "Path is: %s" % 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

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
2年前
SpringBoot学习:整合shiro自动登录功能(rememberMe记住我功能)
首先在shiro配置类中注入rememberMe管理器!复制代码(https://oscimg.oschina.net/oscnet/675f5689159acfa2c39c91f4df40a00ce0f.gif)/cookie对象;rememberMeCookie()方法是设置Cookie的生成模
Easter79 Easter79
2年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Easter79 Easter79
2年前
SpringBoot学习:整合shiro自动登录功能(rememberMe记住我功能)
首先在shiro配置类中注入rememberMe管理器!复制代码(https://oscimg.oschina.net/oscnet/675f5689159acfa2c39c91f4df40a00ce0f.gif)/cookie对象;rememberMeCookie()方法是设置Cookie的生成模
Stella981 Stella981
3年前
Cookie技术
一、Cookie技术Cookie技术是将用户的数据存储到客户端的技术,我们分为两方面学习:第一,服务器端怎样将一个Cookie发送到客户端第二,服务器端怎样接受客户端携带的Cookie1.服务器端向客户端发送一个Cookie1)创建Cookie:CookiecookienewCookie(StringcookieName,
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Stella981 Stella981
3年前
Django组件——cookie与session
Django组件——cookie与session<fontcolor00bff一、会话跟踪技术</font<fontcolorff7f501、什么是会话跟踪技术</font先了解一下什么是会话。可以把
Python进阶者 Python进阶者
8个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这