我如何在django中获取在php中创建的会话?

时间:2012-01-17 07:15:12

标签: php django session

它不是跨域的。 我的网站由php和django组成,我在php中写了一个会话,但我想在django中读取它,我该怎么做?

1 个答案:

答案 0 :(得分:5)

首先,了解how PHP sessions work

要从Django访问PHP的会话数据,您需要会话ID&您需要访问会话数据存储的任何位置。

要获取会话ID,请从cookie中检索它; cookie名称应设置为PHP session.name设置的值。在Django中,您可以使用request.COOKIES.get('<value of PHP's session.name setting>')从cookie中获取会话ID。显然,如果您不依赖cookie来维护会话数据,那么您需要为此组件采用不同的方法。

要访问数据,它会变得有点复杂:您需要知道会话数据的存储位置(PHP默认将其存储在文件中)以及将其转换为有意义的python对象的方法。

要找出数据的存储位置,请使用PHP的session_save_path()函数来获取数据的值  session.save_path配置设置。如果您正确评估,您将能够获得存储会话文件的目录。但是,如果会话数据文件显然不是基于session_ids(我没有便于检查的PHP安装),那么您可能想要编写自己的SessionHandler并将其注册到{{3}这样你就知道哪些文件对应哪个会话id。

一旦知道哪个会话数据对应于每个会话ID,就可以使用python标准库函数来加载&amp;将数据保存到&amp;从文件。不幸的是,我找不到一种简洁的方法来解析PHP的标准会话序列化格式(由set_session_save_handler()定义),因为它与我所知道的任何标准格式都不匹配,但格式看起来并不太复杂

例如,根据session.serialize_handler,如果pr($_SESSION);给出

Array 
( 
    [Config] => Array 
        ( 
            [rand] => 1482441247 
            [time] => 1179248446 
            [userAgent] => cc98eaffc23c634e0efd75ab9e36e810 
        ) 

)

然后会话内容

Config|a:3:{s:4:"rand";i:1482441247;s:4:"time";i:1179247983;s: 
9:"userAgent";s:32:"cc98eaffc23c634e0efd75ab9e36e810";}

你可以看到它有一个名为Config的变量,其类型为数组长度为3,数组内容由以下内容组成:

  • 长度为4且值为rand的字符串,它是值1482441247的整数的键
  • 长度为4且值为time的字符串,它是值1179247983的整数的键
  • 长度为9且值为userAgent的字符串,该字符串是长度为32且值为cc98eaffc23c634e0efd75ab9e36e810
  • 的字符串的键

所以通过一些实验你应该能够编写一个小python模块来获取cookie数据并将其转换为包含dicts&amp;的python列表。其他标准的python数据对象。

免责声明:这完全基于研究;我自己没有尝试这样编辑和编辑欢迎评论,并且一如既往,非常感谢任何downvotes的理由。