【问题标题】:Getting Google App Engine blob info in Django view在 Django 视图中获取 Google App Engine blob 信息
【发布时间】:2013-04-16 09:59:20
【问题描述】:

这是Django on Google App Engine: cannot upload images的后续问题

我得到了将图像上传到 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 时,我想在 GAE 更新 BlobStore 而不是 BlobstoreUploadHandler 后使用 Django 视图来处理结果。我创建了以下视图(根据 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:

明确一点:上传的照片出现在 Blobstore 中;那部分有效。它只是从 Blobstore 中取回这里缺少的密钥。

编辑 3:

根据 Daniel 的建议,我从包含建议的上传处理程序的 djangoappengine 项目中添加了 storage.py,并将其添加到我的 SETTINGS.PY 中。这会在尝试上传时导致以下异常:

'BlobstoreFileUploadHandler' object has no attribute 'content_type_extra'

【问题讨论】:

  • 你读过关于 GAE 的第一个教程吗? developers.google.com/appengine/docs/python/…
  • 是的。 AFAIK 它没有涵盖我在上述问题中遇到的问题。
  • 不,它并没有完全涵盖您所要求的内容。但它涵盖了一些关于 GAE 如何在模型方面工作以及您应该使用什么样的属性的基础知识!据我了解,您正在尝试将 Django 应用程序移植到 App Engine 中。所以为了做到这一点,您必须使用例如 GAE 属性 developers.google.com/appengine/docs/python/ndb/…
  • @Lipis 您的 cmets 与该问题无关。假设您使用的是 Cloud SQL,则完全可以在 GAE 上使用 Django 字段。请专注于实际问题。
  • @DanielRoseman 我的错.. 没太注意.. 并假设我想假设的任何内容.. 我现在就闭嘴:)

标签: django google-app-engine file-upload


【解决方案1】:

这真的很难解决。我发现的最佳解决方案是使用来自djangoappengine 项目的文件上传处理程序(它与 django-nonrel 相关联,但不依赖于它)。这应该处理将 blob 键放入 request.FILES 所需的逻辑,正如您在 Django 中所期望的那样。

编辑

我忘记了 django-nonrel 使用了 Django 的补丁版本,其中一个补丁在这里添加了 content-type-extra 字段。您可以通过子类化上传处理程序来复制功能,如下所示:

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)

并在你的 settings.py 中引用这个子类,而不是原来的。

【讨论】:

  • 谢谢。我查看了文件上传处理程序,但不确定如何将其集成到 Django 视图中。对此有何想法?
  • 您不需要将其集成到视图中,它可以作为可插入的上传处理程序之一 - 只需将其添加到 settings.FILE_UPLOAD_HANDLERS。
  • 当我添加处理程序时,它会引发异常(请参阅我在 OP 中的编辑 3)。我没有找到这方面的信息。有什么想法吗?
  • 太棒了!!非常感谢您的帮助!
猜你喜欢
  • 2011-10-10
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 2012-03-21
  • 2013-07-30
  • 1970-01-01
  • 1970-01-01
  • 2010-10-20
相关资源
最近更新 更多