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已经完全能够做到这一点了。啊,它也是。我完全忘记了。