【问题标题】:Store objects at "request scope" in google app engine在谷歌应用引擎中的“请求范围”存储对象
【发布时间】:2012-06-09 20:52:26
【问题描述】:

我想在使用谷歌应用引擎(python)时在“请求范围”存储一些信息。我的意思是,我想在第一次收到请求时初始化一些信息,然后能够在请求的整个生命周期内从任何地方访问它(并且只能从该请求中访问)。

例如,如果我在当前用户通过身份验证后将其保存在请求范围内。

我该怎么做这种事情?

谢谢!

【问题讨论】:

  • 你用的是什么框架?可能你需要中间件。
  • 然后在 CGI 脚本的开头设置一个局部变量的值。 (如果你没有定义一个名为main()的函数,那么每次请求之后整个东西都会被抛出。)

标签: python google-app-engine scope httprequest


【解决方案1】:

应用引擎本身使用的模式似乎是 threading.local,您可以在 SDK 代码中使用 grep 查找。例如,在runtime/request_environment.py 中将 os.environ 请求设为本地。

一个粗略的例子:

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

【讨论】:

    【解决方案2】:

    你需要这样的东西:-

    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 的解决方案可能行不通。
    • 他说他使用谷歌应用引擎..默认谷歌应用引擎带有 webapp2 模块。所以我建议他以下答案
    猜你喜欢
    • 1970-01-01
    • 2014-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-09
    • 2014-10-21
    • 2023-03-30
    • 1970-01-01
    相关资源
    最近更新 更多