AppEngine处理类似请求的优雅方式

Yi *_* H. 2 python google-app-engine web-applications

我正在制作一台服务器,可以让客户上传和下载不同型号的数据.是否有一些优雅的方式来处理请求?

更准确地说,我不想做这样的事情,

app = webapp.WSGIApplication([
    ('/my_upload_and_download_url/ModelA/(.*)', MyRequestHandlerForA),
    ('/my_upload_and_download_url/ModelB/(.*)', MyRequestHandlerForB),
    ('/my_upload_and_download_url/ModelC/(.*)', MyRequestHandlerForC),
])
run_wsgi_app(app)
Run Code Online (Sandbox Code Playgroud)

因为我在处理程序中所做的事情都是一样的.例如,

class MyRequestHandlerForX(webapp.RequestHandler):
    def get(self, key=None):
        # return the instance with the designated key
    def post(self, key=None):
        # create/get the model instance
        # iterate through the property list of the instance and set the values
Run Code Online (Sandbox Code Playgroud)

处理程序之间的唯一区别是为不同的模型创建实例.网址相似,处理程序几乎相同.

我查看了这篇关于将请求重定向到其他处理程序的帖子,并且我还阅读了一些通过类名创建实例的方法; 但我认为它们都不好.

谁有一个很好的解决方案?

ps这是我在这里的第一篇文章.如果有什么不合适请告诉我,谢谢.

Nic*_*son 5

如何执行此操作在很大程度上取决于请求处理程序中代码的详细信息.你可以这样做一个相当通用的:

class ModelHandler(webapp.RequestHandler):
  def get(self, kind, key):
    model = db.class_for_kind(kind)
    instance = model.get(key)
    # Do something with the instance - eg, print it out

  def post(self, kind, key):
    model = db.class_for_kind(kind)
    instance = model.create_from_request(self.request)

application = webapp.WSGIApplication([
    ('/foo/([^/]+)/([^/]+)', ModelHandler),
])

def main():
  run_wsgi_app(application)

if __name__ == '__main__':
  main()
Run Code Online (Sandbox Code Playgroud)

假设您在每个模型类上定义了'create_from_request'类方法; 你可能不希望这样做,因为它将模型定义与用于输入它们的表单紧密结合; 相反,您可能希望将类型名称或类的映射存储到处理函数,或者通过反映类的属性来完全自动地执行表单和创建.由于你还没有明确说明这是做什么的,所以你不确定,这很难具体.

还要注意main()上面包含一个和其他样板; 虽然它将以您粘贴它的方式工作,但添加main可以大大提高效率,因为它允许App Engine运行时避免在每次请求时评估您的模块.