【问题标题】:Request-Aware Code in Google App Engine -- os.environ?Google App Engine 中的请求感知代码——os.environ?
【发布时间】:2010-02-14 00:45:26
【问题描述】:

在 GAE 中,您可以说 users.get_current_user() 以获取当前登录的用户隐含在当前请求中。即使同时处理多个请求,这也有效——users 模块以某种方式知道get_current_user 函数正在代表哪个请求被调用。我查看了开发服务器中模块的代码,它似乎使用os.environ 来获取与当前请求关联的用户电子邮件和其他值。

这是否意味着每个请求都会获得一个独立的os.environ 对象?

我需要实现一个类似于users.get_current_user() 的服务,它会根据调用代码处理的请求返回不同的值。假设 os.environ 是要走的路,我怎么知道 GAE 已经使用(或保留)了哪些变量名?

另外,有没有办法添加在每个请求之前调用的钩子(或事件处理程序)?

【问题讨论】:

    标签: python google-app-engine request


    【解决方案1】:

    正如the docs 所说,

    Python Web 应用程序与 使用 CGI 的 App Engine 网络服务器 协议。

    这基本上意味着在任何给定进程中一次只处理一个请求(尽管与真正的 CGI 不同,一个进程可以连续重用多个请求,一个接一个,如果它定义了main 函数app.yaml 调度到的各种模块)。有关 CGI 定义和使用的环境变量的文档,另请参阅 this pagethis one

    App Engine 定义的挂钩是围绕 RPC 层的调用,而不是 HTTP 请求。要在每个请求得到服务之前拦截每个请求,您可以使用 app.yaml 将所有请求重定向到单个 .py 文件并在重定向之前在该文件的 main 函数中执行拦截(或者,您可以在开始时调用您的钩子您使用app.yaml 发送到的每个模块中的main)。

    【讨论】:

    • 感谢详细的解释!它消除了我的一些困惑。我实际上已经将所有(非静态)请求重定向到单个 .py 文件。我可以将代码添加到我的 main 中,但我希望收到有关实际 Request 对象的通知,因此我将覆盖从 RequestHandler 继承的类中的“initialize”方法,然后从该类继承而不是直接继承来自 RequestHandler。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-12
    • 1970-01-01
    • 1970-01-01
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多