2012-01-17 44 views

回答

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。顯然,如果你不依賴cookies來維護會話數據,那麼你需要採取不同的方法來處理這個組件。

要訪問數據,它會變得更復雜一點:您需要知道會話數據的存儲位置(PHP默認將其存儲在文件中)以及將其轉換爲有意義的python對象的方式。

要找出數據的存儲位置,請使用PHP的session_save_path()函數來獲取配置設置的值。如果您正確評估這一點,您將能夠獲取存儲會話文件的目錄。但是,如果會話數據文件不明顯基於session_ids(我沒有PHP安裝方便檢查),那麼您可能需要編寫自己的SessionHandler並將其註冊爲set_session_save_handler(),以便您知道哪些文件對應向哪個會話ID發送。

一旦您知道哪個會話數據對應於每個會話ID,您可以使用python標準庫函數從文件中加載&保存數據到&。不幸的是,我無法找到一種簡潔的方式來解析PHP的標準會話序列化格式(由session.serialize_handler定義),因爲它不符合我所知的任何標準格式,但格式看起來並不複雜。

例如,基於this discussion,如果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的字符串,它是用於值與值userAgent​​
  • 長度9的字符串的整數,其是一個關鍵對於長度爲32的字符串與價值的關鍵cc98eaffc23c634e0efd75ab9e36e810

所以用一個小實驗,你應該能夠編寫一些Python模塊採取Cookie數據並將其轉換爲包含類型的字典&其他標準Python數據的Python列表對象。

免責聲明:這是全部基於研究;我自己沒有嘗試過,所以編輯&的意見是值得歡迎的,並且一如既往,任何downvotes的原因非常感謝。