Обработка сбоя формы при загрузке в Appengine Blobstore

Я использую django-nonrel и django-filetransfer @wkornewald в 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 хочет, чтобы вы отправили форму на URL-адрес загрузки BLOB-объектов, и этот URL-адрес не знает, что делать с ошибкой. Должен ли быть промежуточный шаг, который обрабатывает большую часть формы и публикует URL-адрес загрузки тогда и только тогда, когда остальная часть действительна?


person Aaron    schedule 11.03.2011    source источник
comment
Посмотрев на это немного подробнее, похоже, что API Blobstore от Google требует перенаправления из представления, несмотря ни на что. Команда AppEngine проведет панель на PyCon сегодня в 8:00 вечера. Я спрошу, есть ли достойные обходные пути.   -  person Aaron    schedule 12.03.2011
comment
Спросив команду AppEngine, они сказали, что решение может быть либо тем, которое я использовал, перенаправляя и сохраняя данные формы в строке запроса, либо все равно сохраняя данные в базе данных в «незавершенном» состоянии и фиксируя успешную публикацию.   -  person Aaron    schedule 13.03.2011


Ответы (1)


API-интерфейсу хранилища больших двоичных объектов требуется, чтобы представление обработчика загрузки возвращало перенаправление.

как указано в журнале ошибок, опубликованном выше:


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

Чтобы обойти это, я изменил методы add_view и change_view в ModelAdmin, чтобы они возвращали перенаправление при сбое проверки формы, но добавил строку запроса, чтобы входные значения не терялись.

Затем, при инициализации формы в запросе GET, я проверяю «failed_validation» в параметрах запроса, чтобы указать, что данные формы отправляются в формы/наборы форм, чтобы сработала проверка.

Код находится на битбакете: https://[email protected]/aaronmadison/django-filetransfers.

Теперь вы можете загружать в blobstore и обрабатывать ошибки... ура.

person Aaron    schedule 12.03.2011