Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python AppEngine处理类似请求的优雅方式_Python_Google App Engine_Web Applications - Fatal编程技术网

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

Python AppEngine处理类似请求的优雅方式,python,google-app-engine,web-applications,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

我正在制作一个服务器,可以让客户上传和下载不同型号的数据。有什么优雅的方式来处理这些请求吗

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

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)
因为我在处理程序中所做的一切都是一样的。比如说,

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
处理程序之间的唯一区别是为不同的模型创建实例。URL相似,处理程序几乎相同

我检查了将请求重定向到其他处理程序的情况,还阅读了一些通过类名创建实例的方法;但我认为两者都不好

谁有好的解决办法


p、 这是我在这里的第一篇文章。如果有任何不合适的地方,请告诉我,谢谢。

在您的情况下,我可能会让所有内容都指向相同的url路径,并将详细信息放入
GET
参数中,例如
/my\u upload\u和\u download\u url?model=modelA


您还可以使用webapp2(),它具有一系列url路由支持。

您可以解析url路径并进行查找,如下所示:

import urlparse

model_lookup = {'ModelA':ModelA,'ModelB':ModelB, 'ModelC':ModelC}

class MyRequestHandler(webapp.RequestHandler):
    def get(self):
        url = urlparse.urlparse(self.request.uri)
        path_model = url.path.replace('/my_upload_and_download_url/','')
        model = model_lookup[path_model]
        ...
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()
允许您对每个路径使用相同的类:

app = webapp.WSGIApplication([
    ('/my_upload_and_download_url/ModelA/(.*)', MyRequestHandler),
    ('/my_upload_and_download_url/ModelB/(.*)', MyRequestHandler),
    ('/my_upload_and_download_url/ModelC/(.*)', MyRequestHandler),
])
run_wsgi_app(app)

如何做到这一点在很大程度上取决于请求处理程序中代码的细节。您可以这样做:

import urlparse

model_lookup = {'ModelA':ModelA,'ModelB':ModelB, 'ModelC':ModelC}

class MyRequestHandler(webapp.RequestHandler):
    def get(self):
        url = urlparse.urlparse(self.request.uri)
        path_model = url.path.replace('/my_upload_and_download_url/','')
        model = model_lookup[path_model]
        ...
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()
这假设您在每个模型类上定义了“create\u from\u request”类方法;您可能不想这样做,因为它将模型定义与用于输入它们的表单紧密耦合;相反,您可能希望存储种类名称或类到处理程序函数的映射,或者通过反映类的属性来完全自动执行表单和创建。因为你还没有具体说明你不确定做这件事的目的,所以很难更具体


还要注意上面包含的
main()
和其他样板文件;虽然它的工作方式与粘贴它的方式相同,但添加一个main实际上效率更高,因为它允许应用程序引擎运行时避免在每次请求时评估您的模块。

Webapp内置了提取路径部分的机制-真的没有必要使用urlparse进入其中并以艰难(脆弱)的方式进行操作。哇,直到关于db.class_的种类和如何使用路径组件作为参数-谢谢!这并不能真正解决问题。Webapp已经完全能够做到这一点了。啊,它也是。我完全忘记了。