在谷歌应用引擎中,我创建了自己的用户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)]
因此,路由器文件通过从guest虚拟机或授权模块中获取WSGIHandler变量,轻松选择要使用的WSGIApplication url控制器。但是,用户必须关闭路由器的所有选项卡以检测isLoggedIn()
功能的更改。如果您登录,则无法识别您已完成此操作,直到每个选项卡都关闭为止。我有两个可能的原因:
isLoggedIn()
使用os.environ ['HTTP_COOKIE']检索Cookie并查看用户是否已登录,然后根据数据库检查Cookie数据以确保它们是有效的Cookie。可能这可能有一个错误,当页面是什么时,服务器端的cookie没有被刷新?也许是因为我没有从self.request
获取cookie。
是否有可能为了节省前端时间或谷歌应用程序引擎从服务器的内存缓存中缓存来自服务器的脚本?我怀疑它,但我因为这种行为而感到茫然。
提前感谢您的帮助
经过更多测试后,我发现可疑的router.py文件已正确响应,并在添加评论时指导用户登录。这似乎表明了缓存。
我发现了有关WSHI应用程序的更多信息:
Python运行时环境在单个Web服务器上的请求之间缓存导入的模块,类似于独立Python应用程序仅加载模块一次,即使模块是由多个文件导入的。由于WSGI处理程序是模块,因此它们在请求之间进行缓存。 CGI处理程序脚本只有在提供main()例程时才会被缓存;否则,为每个请求加载CGI处理程序脚本。
我想知道以某种方式刷新WSGI模块的效率如何。这无疑是服务器的任务,但解决了我的问题。同样,这似乎是一个部分解决方案。
同样,任何在router.py文件中随机化注释的尝试都是无效的。查找用户登录的id语句完全被忽略,WSGIApplication被设置为其原始状态。我还不确定这是由于webapp2模块中的模块缓存还是由于用户API上的模块缓存。我怀疑后者。
答案 0 :(得分:2)
问题不在于“缓存”,而是WSGI应用程序的工作方式。 WSGI进程在相当长的一段时间内保持活动状态,并在此期间提供多个请求。 {1}}是在启动该进程时定义的,并且在更新进程之前不会更改。你不应该尝试做任何动态或依赖于请求的事情。
答案 1 :(得分: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在不缓存的情况下更改其目录列表。