2013-04-16 42 views
1

這是Django on Google App Engine: cannot upload images獲取谷歌應用程序在Django視圖引擎BLOB信息

我得到了圖像,GAE Blob存儲區工作的上載部分的後續問題。下面是我所做的:

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的渲染的覆蓋管理員條目,以便允許正確的行動對的插入Blob存儲上傳網址:

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在BlobstoreUploadHandler代替已經更新了BLOBSTORE。我創建了以下幾點看法(根據render_change_form方法)和更新urls.py

def add_photo_feature(request): 

def update_photo_feature(request): 

這一切工作很好,但一旦我進入視圖的方法,我有點失落。如何從請求對象獲取Blob密鑰,以便我可以使用PhotoFeature存儲它?我使用標準的Django,而不是Django non-rel。我發現this有關的問題,但它似乎不包含解決方案。我還檢查了傳入視圖的request對象,但找不到與blob密鑰相關的任何內容。

編輯:

Django的請求對象包含FILES字典,這將給我的InMemoryUploadedFile一個實例。我相信,不知怎的,我應該能夠檢索的blob鍵...

編輯2:

只是要清楚:上傳的照片出現在Blob存儲;那部分工作。它只是從Blobstore那裏得到鑰匙,這裏缺少這個。

編輯3:

按丹尼爾的建議,我從djangoappengine項目,該項目包含了建議的上傳處理程序添加storage.py並把它添加到我的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-nonrel相關聯,但不依賴於它)。這應該處理所需的邏輯,將blob密鑰放入request.FILES,正如您在Django中所期望的那樣。

編輯

,我忘了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

當我添加處理程序時,它會引發異常(請參閱OP中的我的編輯3)。我沒有發現這方面的信息。有任何想法嗎? – Roger