2013-04-16 3 views
1

Это прослеживание вопрос Django on Google App Engine: cannot upload imagesПолучение Google App Engine Информация блоб ввиду Джанго

Я получил часть загрузки изображений в GAE Blobstore работает. Вот что я сделал:

В models.py я создал модель PhotoFeature:

class PhotoFeature(models.Model): 
    property = models.ForeignKey(
     Property, 
     related_name = "photo_features" 
    ) 
    caption = models.CharField(
     max_length = 100 
    ) 
    blob_key = models.CharField(
     max_length = 100 
    ) 

В admin.py я создал запись администратора с переопределением для оказания change_form для обеспечения вставки правильного действия к Blobstore URL загрузки:

class PhotoFeatureAdmin(admin.ModelAdmin): 
    list_display = ("property", "caption") 
    form = PhotoFeatureForm 

    def render_change_form(self, request, context, *args, **kwargs): 
     from google.appengine.ext import blobstore 
     if kwargs.has_key("add"): 
      context['blobstore_url'] = blobstore.create_upload_url('/admin/add-photo-feature') 
     else: 
      context['blobstore_url'] = blobstore.create_upload_url('/admin/update-photo-feature') 
     return super(PhotoFeatureAdmin, self).render_change_form(request, context, args, kwargs) 

Как я использую стандартный Django, я хочу использовать представление Django для обработки результата один раз GAE обновил Blobstore в смене BlobstoreUploadHandler. Я создал следующие мнения (в соответствии с методом render_change_form) и обновленный urls.py:

def add_photo_feature(request): 

def update_photo_feature(request): 

Это все работает хорошо, но как только я получаю в метод просмотра я немного потерял. Как получить ключ Blob от объекта запроса, чтобы сохранить его с помощью PhotoFeature? Я использую стандартный Django, а не Django non-rel. Я нашел this вопрос, но, похоже, не содержит решения. Я также осмотрел объект request, который попадает в представление, но не может найти ничего, связанного с ключом blob.

EDIT:

Объект запроса Django содержит словарь FILES, который даст мне экземпляр InMemoryUploadedFile. Я полагаю, что-то я должен быть в состоянии получить ключ блоб от этого ...

EDIT 2:

Просто чтобы быть ясно: загруженное фото появится в Blobstore; эта часть работает. Это просто возвращает ключ от Blobstore, который здесь отсутствует.

EDIT 3:

По предложению Даниила я добавил storage.py из djangoappengine проекта, который содержит предлагаемый обработчик загрузки и добавить его в мой settings.py. Это приводит к следующему исключению при попытке загрузить:

'BlobstoreFileUploadHandler' object has no attribute 'content_type_extra' 
+0

Вы прошли первый учебник по GAE? https://developers.google.com/appengine/docs/python/gettingstartedpython27/ – Lipis

+0

Да. AFAIK не затрагивает проблему, с которой я сталкиваюсь с вышеуказанным вопросом. – Roger

+0

Нет, это не распространяется на то, что вы просите .. но он охватывает некоторые основы, как GAE работает в отношении моделей и какие свойства вы должны использовать! Насколько я понимаю, вы пытаетесь перенести приложение Django в App Engine .. поэтому для этого вам необходимо использовать, например, свойства GAE https://developers.google.com/appengine/docs/python/ndb/ свойства # типы – Lipis

ответ

2

Это действительно сложно исправить. Лучшим решением, которое я нашел, является использование обработчика загрузки файла из проекта djangoappengine (который связан с django-нерелом, но не зависит от него). Это должно обрабатывать требуемую логику, чтобы поместить ключ blob в request.FILES, как и следовало ожидать в Django.

Редактировать

Я забыл, что Джанго-nonrel использует исправленную версию Django, и один из патчей здесь, чтобы добавить поле типа содержимого, дополнительно. Вы можете повторить функциональность наследования обработчик загрузки следующим образом:

from djangoappengine import storage 
class BlobstoreFileUploadHandler(storage.BlobstoreFileUploadHandler): 
    """Handler that adds blob key info to the file object.""" 

    def new_file(self, field_name, *args, **kwargs): 
     # We need to re-process the POST data to get the blobkey info. 
     meta = self.request.META 
     meta['wsgi.input'].seek(0) 
     fields = cgi.FieldStorage(meta['wsgi.input'], environ=meta) 
     if field_name in fields: 
      current_field = fields[field_name] 
      self.content_type_extra = current_field.type_options 
     super(BlobstoreFileUploadHandler, self).new_file(field_name, 
                 *args, **kwargs) 

и ссылаться на этот подкласс в настройках.py, а не оригинал.

+0

Спасибо. Я посмотрел на обработчик загрузки файлов, но не был уверен, как интегрировать его в представления Django. Есть идеи по этому поводу? – Roger

+0

Вам не нужно интегрировать его в представление, он работает как один из подключаемых обработчиков загрузки - просто добавьте его в settings.FILE_UPLOAD_HANDLERS. –

+0

Когда я добавляю обработчик, он генерирует исключение (см. Мое редактирование 3 в OP). Я не нашел никакой информации об этом. Есть идеи? – Roger

Смежные вопросы