之前在django中一直用session处理一些问题,这次想拿到sessionid数据,发现跟以前的想法不太一样:

django中的sessionid要通过下面这种方式取到:

session_key = request.session.session_key

而不能通过下面这样的方式:

request.session['session_key']

平时我们往session中添加的数据实际上保存在request.session._session这个字典中的。

request.session实际上就是一个字典,所以可以像访问字典一样访问session里面的数据,通过遍历session里面的数据,可以证明上面那个观点:

session_tmp = request.session
for key, value in session_tmp.items():print key + ' : ' + str(value)

比方说下面往session里面添加一条记录:

request.session['username'] = 'admin'

实际上这条数据保存在request.session._session这个字典中,用的时候直接像下面这样用就行了:

request.session['username']

或者:

request.session.username

下面是引用的另外一篇介绍django中session用法的文章,讲的不错

转自:http://simple-is-better.com/news/499

Django session 详解-part II-session

Django中的session是一个高级工具,它可以让用户存储个人信息以便在下次访问网站中使用这些信息。session的基础还是cookie,但是它提供了一些更加高级的功能。请看下面的一个例子:

使用session:

这个例子中实现了一个简单的计数功能:

def test_count_session(request):
    if 'count' in request.session:
        request.session['count'] += 1
        return HttpResponse('new count=%s' % request.session['count'])
    else:
        request.session['count'] = 1
        return HttpResponse('No count in session. Setting to 1')

比较session和cookie的使用我们可以发现他们有一下几点不同:

  • session管理更加统一和方便:每个session中的属性值可以使用查询以及修改操作。
  • 虽然我们在例子中只是使用了一个整数的属性,但实际上session中还可以包含很多类型的属性,比如字典属性,并且它可以很方便地用Python中的内建方法访问它们。

虽然我们在session中设置了一个计数器count,但是如果我们抓取当前的cookie时会发现,竟然没有count这个属性!而只是设置了一个看起来似乎是唯一标识的sesionid,这当然是处于安全方面的考虑。假定用户不停地访问一个页面,比如访问了10次,那我们是不是就要对他的计数器+10次呢?显然这样做不符合实际情况,有了这个sessionid,我们就可以判断是否是同一个用户访问一个页面了。

Set-Cookie:sessionid=a92d67e44a9b92d7dafca67e507985c0;
           expires=Thu, 07-Jul-2011 04:16:28 GMT;
           Max-Age=1209600;
           Path=/

深入了解sessionid:

默认情况下,Django会将session保存在django_session这个表中:

CREATE TABLE "django_session" (
    "session_key" varchar(40) NOT NULL PRIMARY KEY,
    "session_data" text NOT NULL,
    "expire_date" datetime NOT NULL
);

其中的session_key就相当于cookie中保存的sessionid,而session_data就包含了当前session中的属性。如果想详细看看我们上面创建的session的信息,可以像下面这样:

from django.contrib.sessions.models import Session
#...
sess = Session.objects.get(pk='a92d67e44a9b92d7dafca67e507985c0')
print(sess.session_data)
print(sess.get_decoded())

它或许会输出类似下面的信息:

ZmEyNDVhNTBhMTk2ZmRjNzVlYzQ4NTFjZDk2Y2UwODc3YmVjNWVjZjqAAn1xAVUFY291bnRxAksG
cy4=

{'count': 11}

Django会保存request.session的相关信息到数据库,然后用户可以通过cookie中的sessionid对它进行各种操作。当然这些操作我们可以通过Django自带的session模块轻松操作,从而简化了程序员的工作。下面我们来详细了解一下Django中的session。

session中间件:

首先看看Django中的django.http.HttpRequest,了解一下它是如何取得session并对其属性进行操作的。the Django Book中对它有详细的介绍,我们这里就简单的说一下原理吧 ! Django中的页面请求的简单模型就像下面这样:

视图方法接受一个httprequest后,对它进行一系列的操作,然后返回一个httpresponse。而中间件增加一些额外的操作:

Django的中间件框架就是一些所谓的hook类,它设置在Django项目中的settings中的MIDDLEWARE_CLASSES内。当然您也可以添加自己的MIDDLEWARE_CLASSES。默认情况下,django.contrib.sessions.middleware.SessionMiddleware 是自动添加的。查看它的源代码,我们可以发现它实际上就是实现了2个hooks:process_request和process_response。

process_request提取当前cookie中的session KEY(也就是sessionid),其中SESSION_COOKIE_NAME就是我们说的sessionid。而request.session则包含了"session store"对象。

process_response负责保存"session store"对象并将它返回给客户端。

session的存储:

Django中可以通过设置SESSION_ENGINE属性来指定后台引擎来处理session。默认是django.contrib.sessions.backends.db。在Django安装目录中的sessions/backends下可以找到很多其他的引擎,这里就不再赘述。

不管是哪一种引擎,它都实现了一个StorageSession类,其中包含了对session的各种操作方法。

为了理解它的工作原理,假定用户想访问request.session,来看看它的工作流程:

  1. Session中间件的process_request实例化一个request.session,并将db.SessionStore附带session_key保存到构造函数(姑且这么叫吧,实在想不到好听的名字)。
  2. SessionStore的构造函数会保存session key以便用户访问。
  3. process_request的工作就算完成了,接着session中间件会将request传给view方法。
  4. SessionBase是一个类字典实例,我们可以通过Python内建的字典方法对它进行操作,例如__getitem__。它还有一个很有用的方法:_get_session(它用到了load方法,load方法是由db.SessionStore来执行的,而不是SessionBase,期间还有一些对数据的编码工作)

下面来看一个简单的例子:

def encode(self, session_dict):
    "Returns the given session dictionary pickled and encoded as a string."
    pickled = pickle.dumps(session_dict, pickle.HIGHEST_PROTOCOL)
    hash = self._hash(pickled)
    return base64.encodestring(hash + ":" + pickled)

结论:

Django基于最简单的HTTP request和HTTP response而实现session的使用。希望上面的一些东西能给您带来一些灵感,如果需要详细了解session,读者可以当django官网的session文档中去找。

# 作者微博:http://weibo.com/amaozhao

django中获取sessionid相关推荐

  1. Django框架(19.Django中获取url的参数(位置参数以及关键字参数))

    捕获url参数 进行url匹配时,把所需要的捕获的部分设置成一个正则表达式组,这样django框架就会自动把匹配成功后相应组的内容作为参数传递给视图函数. 位置参数 位置参数,参数名可以随意指定   ...

  2. django中使用POST方法 获取POST数据

    在django中获取post数据,首先要规定post发送的数据类型是什么. 1.获取POST中表单键值数据 如果要在django的POST方法中获取表单数据,则在客户端使用JavaScript发送PO ...

  3. SpringSession的源码解析(从Cookie中读取Sessionid,根据sessionid查询信息全流程分析)

    前言 上一篇我们介绍了SpringSession中Session的保存过程,今天我们接着来看看Session的读取过程.相对保存过程,读取过程相对比较简单. 本文想从源码的角度,详细介绍一下Sessi ...

  4. echarts导入mysql数据库_Echarts最新:Django中从mysql数据库中获取数据传到echarts方式_爱安网 LoveAn.com...

    关于"Echarts"的最新内容 聚合阅读 这篇文章主要介绍了基于vue+echarts 数据可视化大屏展示的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随 ...

  5. Django框架(21.Django中设置cookie以及获取cookie)

    状态保持 http协议是无状态的.下一次去访问一个页面时并不知道上一次对这个页面做了什么 Cookie 1.cookie是由服务器生成,存储在浏览器端的一小段文本信息. 2.cookie的特点: 以键 ...

  6. python django mysql结果获取_Django中从mysql数据库中获取数据传到echarts方式

    尝试了几种方法,感觉过于复杂,于是自己写了一个方法. (1)首先在要绘图的页面传入从数据库中提取的参数,这一步通过views可以实现: (2)然后是页面加载完成时执行的函数ready,调用方法f; ( ...

  7. python输入身份证号得到出生日期_初学django1:django模型中自定义方法从身份证号码中获取出生日期...

    有一个Person的Model,里面用到了身份证.出生日期字段.要求如下: 在存入的时候对身份证号码进行校验. 自动从身份证号码中获取出生日期. 因为初学,不知道如何插入自定义校验,就在Model.p ...

  8. python中choices_在django中实现choices字段获取对应字段值

    我就废话不多说了,大家还是直接看代码吧~ class Area(models.Model): Area_Level = ( (0, u'全国'), (1, u'省.直辖市'), (2, u'市.直辖市 ...

  9. Django动态获取mysql连接,django model中的choices 动态从数据库中获取

    django model中的choices 动态从数据库中获取 例如 model中,有一个type字段 type = models.CharField(max_length=255, default= ...

最新文章

  1. 微服务拆的太细了会有什么问题
  2. 【Paper】2009_Controllability of Multi-Agent Systems from a Graph-Theoretic Perspective 精炼版
  3. 破解IDEA2018的正确姿势
  4. 专访阿里云萧少聪、曹龙:一家云厂商对入局数据库做了哪些思考?
  5. PHP安装zip拓展,以及libzip安装问题
  6. P3312 [SDOI2014]数表(离线 + 树状数组前缀和优化)
  7. LeetCode 688. “马”在棋盘上的概率(DP)
  8. 基于JAVA+SpringBoot+Vue+Mybatis+MYSQL的图书馆管理系统
  9. flex 与 后台通讯
  10. QFileInfoList
  11. Spring+Hibernate整合Hessian
  12. JS判断字符串包含的方法
  13. n卡驱动登录不上去_鲜牛加速器:PubgLite报错问题解决方法汇总(附N卡优化及滤镜)...
  14. python多线程操作数据库问题
  15. 软件工程第二篇博客(“相等”)
  16. 短网址还原 php,php怎么实现短网址还原
  17. JavaScript 正则匹配中英文姓名
  18. JavaScript字符串(Date和Math对象)的相关操作及实例
  19. Keil5 编译时显示..\OBJ\TPAD.axf: error: L6002U: Could not open file ..\obj\main.o: No such file or direct
  20. 新的开始,与大学告别

热门文章

  1. 一个好用的图形化deb软件包安装器
  2. 关于推广网络游戏《传奇3》计划书
  3. mysql服务端放置_放置类游戏后端服务器架构设计与实现
  4. python subprocess使用_Python subprocess模块用法详解
  5. TPS23753A-3.3V,5.0V,12V设计已验证
  6. 10个丑惯了的互联网设计元素
  7. 解决csrftoken = soup.find(id=“csrftoken“).get(“value“)AttributeError: ‘NoneType‘ object has no attri问
  8. 几年来的工作与生活感悟
  9. linux控制台单人五子棋简书,我的“五子棋”闺蜜
  10. android6.0获取相机权限