处理上传到Appengine Blobstore时的表单失败

2 投票
1 回答
808 浏览
提问于 2025-04-16 13:30

我正在使用 @wkornewald 的 django-nonrel 和 django-filetransfer 在 Google App Engine 上。

我可以顺利上传文件,但只有在整个表单都有效的情况下。如果表单中的任何字段验证失败,它就会完全崩溃,而不是返回给用户让他们修正错误。

错误信息是:


INFO     2011-03-10 20:27:09,496 dev_appserver.py:535] Internal redirection to /admin/rr/member/add/
INFO     2011-03-10 20:27:09,662 dev_appserver_blobstore.py:328] Upload handler returned 200
ERROR    2011-03-10 20:27:09,662 dev_appserver_blobstore.py:341] Invalid upload handler response. Only 301, 302 and 303 statuses are permitted and it may not have a content body.
INFO     2011-03-10 20:27:09,680 dev_appserver.py:3317] "POST /_ah/upload/ag5kbXJvbGxpbnJlbGljc3IcCxIVX19CbG9iVXBsb2FkU2Vzc2lvbl9fGIkBDA HTTP/1.1" 500 -

我有一个简单的模型,长这样:


class Member(PhotoMixin, models.Model):
    name = models.CharField(max_length=50)
    name2 = models.CharField(max_length=50, blank=True)

    member_since = models.DateField(blank=True, null=True)
    full_size_image = models.FileField(verbose_name="Photo", upload_to='members/')
    is_active = models.BooleanField(default=True)

有没有办法让我更优雅地处理这个问题?我觉得这可能是因为 django-filetransfers 希望你把表单提交到 blob 上传的 URL,而那个 URL 不知道在失败时该怎么处理。是否应该有一个中间步骤,处理大部分表单,并且只有在其他字段有效时才提交到上传的 URL?

1 个回答

2

blobstore API 要求上传处理程序的视图必须返回一个重定向。

正如上面发布的错误日志所说:


Only 301, 302 and 303 statuses are permitted and it may not have a content body.

为了解决这个问题,我修改了 ModelAdmin 的 add_view 和 change_view 方法,让它们在表单验证失败时返回一个重定向,同时附加上查询字符串,这样输入的值就不会丢失。

接下来,在处理 GET 请求时,我会检查查询参数中是否有 'failed_validation',这样就可以把表单数据发送到表单或表单集,以便触发验证。

相关代码可以在 bitbucket 上找到:https://aaronmadison@bitbucket.org/aaronmadison/django-filetransfers

现在你可以上传到 blobstore 并处理错误了……太好了。

撰写回答