Handle Form Failure when uploading to Appengine Blobstore
Asked Answered
A

1

2

I'm using @wkornewald 's django-nonrel and django-filetransfer on Google App Engine.

I'm able to upload files just fine, but only when the entire form is valid. If the form fails validation for any field, it completely blows up instead of returning to the user to fix the changes.

error message is:


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 -

I have a simple model that looks like this:


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)

Is there a way I can more gracefully handle this? I feel its probably because django-filetransfers wants you to post the form to the blob upload url, and that url doesnt know what to do with a failure. Should there be an intermediate step that handles most of the form and posts to the upload url if and only if the rest is valid?

Ailbert answered 11/3, 2011 at 12:22 Comment(2)
After looking at this a bit more, it looks like the Blobstore api from google requires a redirect from the view no matter what. The AppEngine team has a panel at PyCon at 8:00 tonight. I'll ask if there are any decent workarounds.Ailbert
After asking the AppEngine team, they said the solution could either be the one I used by redirecting and keeping the form data in the query string, or saving the data to the database anyways in an 'incomplete' state and fixing on a successful post.Ailbert
A
2

The blobstore api requires the upload handler view to return a redirect.

as the error log posted above states:


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

To work around this, I modified the add_view and change_view methods of the ModelAdmin to return a redirect on a form validation failure, but tacked on the query string so the input values are not lost.

Next, when initializing the form on the GET request, I check for 'failed_validation' in the query parameters to indicate to send the form data to the forms/formsets so validation will trigger.

The code is on bitbucket: https://[email protected]/aaronmadison/django-filetransfers.

Now you can upload to the blobstore and handle errors... yay.

Ailbert answered 12/3, 2011 at 23:14 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.