GAE Blobstore:上传Blob以及其他文本字段

5

我有一个表单,其中包含文本字段和一个上传图片的元素。
我想将blob存储在blobstore中,并在我的模型(ndb.Model)中使用ndb.BlobKeyProperty()进行引用。
此链接中展示的方法使用一个上传处理程序(UploadHandler),该处理程序是通过这种方式创建的链接调用的:

upload_url = blobstore.create_upload_url('/upload')

upload_url是创建用于上传blob的页面中的表单操作。然而,我的表单包含其他未在UploadHandler post方法中处理的字段。 我找到的临时解决方案是创建一个处理程序,它继承自我的BaseHandler以及BlobstoreUploadHandler:

class EditProfile(blobstore_handlers.BlobstoreUploadHandler, BaseHandler)
    def get(self):
        params['upload_url'] = blobstore.create_upload_url('/upload_blob1')
        ... fields ...

    def post(self):
        upload_blob = self.get_uploads()
        blob_key = upload_blob[0].key()
        value_field1 = self.request.POST.get('field1')
        value_field2 = self.request.POST.get('field2')
        value_field3 = self.request.POST.get('field3')
        ... 

这种方法是可行的,但我必须在main.py中为每个需要上传blob的页面定义一个新的处理程序:

app = webapp2.WSGIApplication([ ('/upload_blob1', handlers.EditProfile),
                                ('/upload_blob2', handlers.EditBlob2Handler),
                                ('/serve/([^/]+)?', handlers.ServeHandler) ], 
                                debug=os.environ['SERVER_SOFTWARE'].startswith('Dev'), config=webapp2_config)

问题:我如何使用一个单一的上传处理程序(例如:UploadHandler),使其从不同的页面调用以执行上传 blob 任务?我知道对于有经验的 GAE 程序员来说,这可能非常简单,但我还没有找到解决方案。


到目前为止,您输入的所有内容都是正确的。如果您有两个不同的表单都需要上传一个 blob,则它们将需要两个单独的处理程序。只有在所有表单字段相同时才使用相同的处理程序才有意义。 - dragonx
如果我想要只有一个上传处理程序(UploadHandler),同时被handlers.EditProfilehandlers.EditBlob2Handler使用,这是否可能?如何实现? - Richard Haber
如果提交给两个处理程序的表单相同且两个处理程序也相同,则可以通过将适当的URL作为目标传递给create_upload_url()来仅将它们都重定向到同一个URL。 如果处理程序不同并且执行不同的操作,则提出这样的问题就没什么意义了。 - dragonx
你刚才回答了错误问题的正确答案。我想现在我对事情的运作有了更好的理解!谢谢! - Richard Haber
1个回答

0

简短回答:可以。

处理程序只是解析上传表单的代码,然后根据信息执行操作。

从技术上讲,即使是不同的上传,您也可以只有一个表单,但这取决于它们有多么不同以及您是否希望拆分代码。

例如,如果您的form1上传“名字”、“姓氏”、“喜欢的颜色”,而您的form2上传“名字”、“姓氏”、“喜欢的数字”,那么您的/upload处理程序可以简单地读取参数并以不同的方式处理它们。

如果(req.getParameter("Favorite_Number")!= null){做任何事情}

否则,如果(req.getParameter("Favorite_Color")!= null){做任何事情}

这只是一种设计问题。关于您是否可以使用一个处理程序的问题,答案是肯定的。但是,如果它们在功能上不同,建议使用不同的处理程序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接