我想在使用谷歌應用程序引擎(Python)時在「請求範圍」存儲一些信息。我的意思是,我希望在首次收到請求時初始化一些信息,然後能夠在請求的任何地方(並且只能從請求中)訪問它。在谷歌應用程序引擎中的「請求範圍」存儲對象
這樣做的一個例子是,如果我在通過身份驗證後將當前用戶的名稱保存在請求範圍內。
我該如何去做這種事?
謝謝!
我想在使用谷歌應用程序引擎(Python)時在「請求範圍」存儲一些信息。我的意思是,我希望在首次收到請求時初始化一些信息,然後能夠在請求的任何地方(並且只能從請求中)訪問它。在谷歌應用程序引擎中的「請求範圍」存儲對象
這樣做的一個例子是,如果我在通過身份驗證後將當前用戶的名稱保存在請求範圍內。
我該如何去做這種事?
謝謝!
應用程序引擎中使用的模式似乎是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
你需要的東西是這樣的: -
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並且所有請求都將通過初始化方法進行。
OP說他沒有使用webapp2框架,所以涉及'webapp2.RequestHandler'子類的解決方案可能不是不會去工作。 – geoffspear
他說他使用谷歌應用程序引擎..默認谷歌應用程序引擎自帶webapp2模塊。所以我建議他以下答案 –
你在用什麼框架?可能你想要中間件。 – geoffspear
沒有框架,只是python。 –
然後只需在CGI腳本的開頭設置一個局部變量的值。 (如果你沒有定義一個名爲'main()'的函數,那麼在每次請求之後,整個事情都會被拋出。) – geoffspear