用生成(BaseHTTPRequestHandler作为WSGI)替换AppEngine Devserver

1 投票
1 回答
583 浏览
提问于 2025-04-15 13:40

我想用 spawning 来替代 AppEngine 的开发服务器。spawning 可以处理标准的 wsgi 处理程序,就像 appengine 一样,所以在上面运行你的应用程序很简单。

不过,开发服务器会考虑到你的 app.yaml 文件,这个文件里有网址重定向等设置。我查看了一下开发服务器的代码,发现获取 BaseHTTPRequestHandler 其实很简单:

from google.appengine.tools.dev_appserver import CreateRequestHandler
dev = CreateRequestHandler(os.path.dirname(__file__), '', require_indexes=False, static_caching=True)

但是,BaseHTTPRequestHandler 不是一个 WSGI 应用,所以我猜我需要在它周围加点东西才能让它工作。有没有什么提示?

1 个回答

2

我觉得你可能很难把 dev_appserver 的一部分拿出来,直接用在自定义的 WSGI 服务器上。因为 dev_appserver 做了很多“魔法”,它的结构并不是为了让你轻松地把它当作 WSGI 的包装器在其他服务器上使用(真是可惜)。

你可以看看 TwistedAE,他们正在创建一个替代的服务环境;如果你真的想使用生成(spawning),那么可以考虑以 TwistedAE 的工作为基础。

不过,如果你想自己动手,有几个选择:

  1. 你可以写一个自己的适配器,把 WSGI 和 CreateRequestHandler 返回的类连接起来。在这种情况下,你需要复制 Python SDK 中 BaseHTTPServer.BaseHTTPRequestHandler 的接口。不过,把 WSGI 转换成那样,只是为了让 dev_appserver 的代码再转换回来,听起来有点奇怪。
  2. 你可以从 DevAppServerRequestHandler 的 _HandleRequest 方法中提取代码,修改它以适应 WSGI,然后从中创建一个 WSGI 应用(如果你想自己动手,这可能是最好的选择)。
  3. 你也可以从头开始,这也是我认为 TwistedAE 采取的方法。

无论你做什么,有一点要记住:App Engine 明确要求它的应用在单线程环境中运行。如果你希望应用在本地和生产环境或 dev_appserver 上的表现一致,就不要使用多线程的方法!

撰写回答