【问题标题】:Handle Form Failure when uploading to Appengine Blobstore上传到 Appengine Blobstore 时处理表单失败
【发布时间】:2011-07-13 11:17:06
【问题描述】:

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

我可以上传文件就好了,但只有当整个表单都有效时。如果表单对任何字段的验证失败,它会完全崩溃,而不是返回给用户来修复更改。

错误信息是:


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?

【问题讨论】:

  • 再看这个之后,看起来谷歌的 Blobstore api 无论如何都需要从视图重定向。 AppEngine 团队今晚 8:00 在 PyCon 举行了一个小组讨论。我会问是否有任何体面的解决方法。
  • 在询问 AppEngine 团队后,他们说解决方案可能是我使用的解决方案,方法是将表单数据重定向并保留在查询字符串中,或​​者以“不完整”的形式将数据保存到数据库中状态并修复成功的帖子。

标签: python django google-app-engine django-forms django-nonrel


【解决方案1】:

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 并处理错误...耶。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-05
    • 1970-01-01
    相关资源
    最近更新 更多