Google App Engine中的请求感知代码——os.environ?
在GAE(Google App Engine)中,你可以使用 users.get_current_user()
这个函数来获取当前登录的用户信息,这个信息是和当前请求相关的。即使同时处理多个请求,这个函数也能正常工作,因为 users
模块知道是哪个请求在调用 get_current_user
。我查看了开发服务器上这个模块的代码,发现它是通过 os.environ
来获取用户的电子邮件和其他与当前请求相关的值。
这是不是意味着每个请求都有一个独立的 os.environ
对象呢?
我需要实现一个类似于 users.get_current_user()
的服务,这个服务会根据调用代码处理的请求返回不同的值。如果 os.environ
是正确的做法,我该如何知道哪些变量名已经被GAE使用(或保留)呢?
另外,有没有办法添加一个钩子(或事件处理器),在每个请求之前被调用呢?
1 个回答
3
根据文档的说法,
一个Python网页应用通过CGI协议与App Engine的网页服务器进行交互。
这基本上意味着在任何给定的进程中,一次只能处理一个请求(不过,与真正的CGI不同的是,一个进程可以连续处理多个请求,只要它在不同的模块中定义了main
函数,并且这些模块是通过app.yaml
来分发的)。想了解更多,可以查看这个页面,以及这个页面,它们提供了CGI定义和使用的环境变量的文档。
App Engine定义的钩子是围绕RPC层的调用,而不是HTTP请求。为了在请求被处理之前拦截每个请求,你可以使用app.yaml
将所有请求重定向到一个单独的.py
文件,并在该文件的main
函数中进行拦截,然后再进行重定向(或者,你也可以在每个模块的main
函数开始时调用你的钩子,这些模块都是通过app.yaml
来分发的)。