2012-12-11 109 views
4

我正在使用webapp2_extras來設置會話變量。如果我在設置它之後打印該變量,則該值是正確的。 save_sessions調用也被創建。但是,當我再次發出請求時,變量未設置。Webapp2會話在請求之間丟失

大部分代碼是從webapp2 documentation採取:

import webapp2 
from webapp2_extras import sessions 

class BaseHandler(webapp2.RequestHandler): 
    def dispatch(self): 
     self.session_store = sessions.get_store(request=self.request) 
     try: 
      webapp2.RequestHandler.dispatch(self) 
     finally: 
      self.session_store.save_sessions(self.response) 
    @webapp2.cached_property 
    def session(self): 
     return self.session_store.get_session() 

class MainHandler(BaseHandler): 
    def get(self): 
     foo = self.session.get('foo') 
     print foo 
     self.session['foo'] = 'bar' 
     foo = self.session.get('foo') 
     print foo 
     self.response.write(BaseHandler) 

config = {} 
config["webapp2_extras.sessions"] = { 
    "secret_key": "key", 
} 

app = webapp2.WSGIApplication([ 
    ('/', MainHandler) 
], debug=True, config=config) 

這總是返回「無事」,但我想它返回「什麼東西」爲第二個請求。

+0

有同樣的問題,你有沒有找到解決的辦法? –

+0

@MartinKapfhammer不,不幸的是。 –

+0

嘗試每次使用會話類後調用self.response.out.write ...也許這是巧合,但它對我很有用 –

回答

0

看着我的配置我有這樣的設置會話存儲的位置(應用程序引擎的配置是有點不同的,以我理解標準)

@webapp2.cached_property 
    def session(self): 
     # Returns a session using the default cookie key. 
     return self.session_store.get_session(name='mc_session', 
     factory=sessions_memcache.MemcacheSessionFactory) 

嘗試,也許?否則,你的代碼對我來說看起來不錯,而沒有實際運行它。

您還需要此導入:

from webapp2_extras import sessions_memcache 

Webapp2 Memcache sessions

+0

謝謝。儘管如此,我仍然得到了與該代碼相同的行爲。 –

+0

我從這裏借用了webapp2會話和GAE:http:// webapp-improved。appspot.com/api/webapp2_extras/sessions.html您可以獲取示例代碼提供的行爲方式嗎?編輯:我希望你可以,因爲它是你發佈的代碼! MIght稍後有一段時間來運行你的代碼。 –

2

我知道這是一個相當古老的問題,但我只是碰到了同樣的問題,這裏是解決了這個問題對我來說。

我改變了webapp2配置對象來添加auth參數。

曾經被認爲是:

config = {} 
config["webapp2_extras.sessions"] = {"secret_key": "key" } 

app = webapp2.WSGIApplication([('/', MainHandler)], debug=True, config=config) 

現在應該是:

config = {} 
config["webapp2_extras.sessions"] = {"secret_key": "key" } 
config["webapp2_extras.auth"] = {'session_backend': 'securecookie'} 

app = webapp2.WSGIApplication([('/', MainHandler)], debug=True, config=config) 
+1

如果它是securecookie ....您不必定義「webapp2_extras.auth」會話後端。它的默認行爲 – janscas

0

假設你正在使用的數據存儲作爲會話後端,這可能與最終一致性做。如果您嘗試推遲第二個請求幾秒鐘,然後嘗試請求,您可能會看到會話數據,並證明它。

切換到securecookie可能會有所幫助,雖然由於某種原因它不適用於我......仍在研究它。


我的問題的一大部分實際上是由於我對cookie標準的無知。這在other stackoverflow question中有解釋。

+0

get和auth令牌中沒有最終的一致性,並且使用gets檢索會話。 – janscas

+0

@janscas我必須禮貌地不同意。 Google的主留言簿示例顯示瞭如何在寫入數據存儲之後嘗試獲取留言簿備註列表,但不會返回最近寫入的評論。 – Mazyod

+0

你是指這個例子嗎? https://github.com/GoogleCloudPlatform/appengine-guestbook-python/blob/part4-usingdatastore/guestbook.py – janscas

0

我有類似的問題。對我來說固定的是將後端設置爲與默認(securecookie)不同。將其設置爲memcache似乎對我有用。

@webapp2.cached_property 
     def session(self): 
     return self.session_store.get_session(backend="memcache") 

我也在.auth的配置中設置了這個。不知道這是否會覆蓋get_session反正backend參數...

config["webapp2_extras.auth"] = {'session_backend': 'memcache'}