2012-06-09 31 views
0

我想在使用谷歌應用程序引擎(Python)時在「請求範圍」存儲一些信息。我的意思是,我希望在首次收到請求時初始化一些信息,然後能夠在請求的任何地方(並且只能從請求中)訪問它。在谷歌應用程序引擎中的「請求範圍」存儲對象

這樣做的一個例子是,如果我在通過身份驗證後將當前用戶的名稱保存在請求範圍內。

我該如何去做這種事?

謝謝!

+0

你在用什麼框架?可能你想要中間件。 – geoffspear

+0

沒有框架,只是python。 –

+0

然後只需在CGI腳本的開頭設置一個局部變量的值。 (如果你沒有定義一個名爲'main()'的函數,那麼在每次請求之後,整個事情都會被拋出。) – geoffspear

回答

2

應用程序引擎中使用的模式似乎是threading.local,您可以在SDK代碼中使用grep。例如,使os.environ請求在本地完成,就像在runtime/request_environment.py中那樣完成。

一個粗略的例子:

import threading 

class _State(threading.local): 
    """State keeps track of request info""" 
    user = None 

_state = _State() 

從其他地方,你可以在處理程序代碼早期驗證。

from state import _state 
if authentication_passed: 
    _state.user = user 

,並提供方便,可以在你的代碼的其他部分使用

from state import _state 
def get_authenticated_user(): 
    user = _state.user 
    if not user: 
     raise AuthenticationError() 
    return user 
1

你需要的東西是這樣的: -

class BaseHandler(webapp2.RequestHandler): 
    #A function which is useful in order to determine whether user is logged in 
    def initialize(self, *a, **kw): 
    #Do the authentication 
    self.username = username 


class MainHandler(BaseHandler): 
def get(self): 
    print self.username 

現在,如果你繼承BaseHandler類中的所有要求將首先通過BaseHandler類的初始化方法,並且因爲在BaseHandler類中您正在設置用戶名 和MainHandler繼承了BaseHandler形式將定義self.username並且所有請求都將通過初始化方法進行。

+0

OP說他沒有使用webapp2框架,所以涉及'webapp2.RequestHandler'子類的解決方案可能不是不會去工作。 – geoffspear

+1

他說他使用谷歌應用程序引擎..默認谷歌應用程序引擎自帶webapp2模塊。所以我建議他以下答案 –