1

在谷歌应用引擎中,我创建了自己的用户 API,适当地称为用户,因此它不会干扰谷歌应用引擎 API 用户。像大多数多用户网站一样,根据用户是否登录,该网站的两个“版本”可供用户使用。因此创建了一个名为 router.py 的文件,其代码如下

import webapp2

from lib import user
import guest
import authorized

if user.isLoggedIn():
    app = webapp2.WSGIApplication(authorized.WSGIHandler,debug=True)
else:
    app = webapp2.WSGIApplication(guest.WSGIHandler,debug=True)

guest和模块的authorized格式类似于您的常规应用程序脚本,例如:

import webapp2
import os

class MainPage(webapp2.RequestHandler):
    def get(self,_random):
        self.response.out.write('authorized: '+_random)

WSGIHandler = [('/(.*)', MainPage)]

因此,路由器文件通过从来宾模块或授权模块中获取 WSGIHandler 变量,轻松选择要使用的 WSGIApplication url 导向器。但是,用户必须关闭路由器的所有选项卡才能检测到isLoggedIn()功能的变化。如果您登录,它不会识别您已经这样做,直到每个选项卡都关闭。我有两个可能的原因:

  1. isLoggedIn()使用 os.environ['HTTP_COOKIE'] 检索 cookie 并查看用户是否登录,然后根据数据库检查 cookie 数据以确保它们是有效的 cookie。可能这可能会出现错误,即在页面刷新时服务器端的 cookie 没有被刷新?也许是因为我没有从self.request.

  2. 是否有可能为了节省前端时间或谷歌应用引擎将来自服务器的脚本缓存在服务器的内存缓存中?我对此表示怀疑,但我对这种行为的原因感到茫然。

在此先感谢您的帮助

编辑

经过更多测试后,我发现 router.py 文件怀疑响应正确,并在添加评论时根据登录的用户定向用户。这似乎表明缓存。

编辑 2

我发现了有关 WSHI 应用程序的更多信息:

Python 运行时环境在单个 Web 服务器上的请求之间缓存导入的模块,类似于独立的 Python 应用程序只加载一次模块,即使该模块是由多个文件导入的。由于 WSGI 处理程序是模块,它们在请求之间被缓存。只有提供 main() 例程的 CGI 处理程序脚本才会被缓存;否则,将为每个请求加载 CGI 处理程序脚本。

我想知道以某种方式刷新 WSGI 模块的效率如何。这无疑会给服务器带来任务,但可以解决我的问题。同样,这似乎是部分解决方案。

编辑 3

同样,任何在 router.py 文件中随机化注释的尝试都是无效的。查找用户登录的 id 语句完全被忽略,并且 WSGIApplication 被设置为其原始状态。我还不确定这是由于 webapp2 模块中的模块缓存还是由于用户 API 上的模块缓存。我怀疑是后者。

4

2 回答 2

2

问题不在于“缓存”,而在于 WSGI 应用程序的工作方式。一个 WSGI 进程在相当长的时间内保持活动状态,并在此期间服务多个请求。是在该app进程启动时定义的,并且在进程更新之前不会更改。此时您不应该尝试做任何动态的或依赖于请求的事情。

于 2013-02-20T15:38:36.707 回答
1

将 router.py 替换为:

from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app

from lib import user
import guest
import authorized

def main():
    if user.isLoggedIn():
        run_wsgi_app(authorized.application)
    else:
        run_wsgi_app(guest.application)

if __name__ == "__main__":
    main()

降级到旧的 webapp 允许您动态更改 wsgi 应用程序。它已经过测试并且可以完美运行!CGI 适配器run_wsgi_app允许 webapp 在不缓存的情况下更改它的目录列表。

于 2013-02-20T16:35:07.027 回答