【发布时间】: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