使用Django在App Engine上存储图像

Hen*_*teg 5 django google-app-engine

我正在尝试使用Django在Google App Engine上的db.BlobProperty字段中上传并保存已调整大小的图像.

我认为处理请求的相关部分如下所示:

image = images.resize(request.POST.get('image'), 100, 100)
recipe.large_image = db.Blob(image)
recipe.put()
Run Code Online (Sandbox Code Playgroud)

这似乎是文档中示例的逻辑django等价物:

from google.appengine.api import images

class Guestbook(webapp.RequestHandler):
  def post(self):
    greeting = Greeting()
    if users.get_current_user():
      greeting.author = users.get_current_user()
    greeting.content = self.request.get("content")
    avatar = images.resize(self.request.get("img"), 32, 32)
    greeting.avatar = db.Blob(avatar)
    greeting.put()
    self.redirect('/')
Run Code Online (Sandbox Code Playgroud)

(来源:http://code.google.com/appengine/docs/python/images/usingimages.html#Transform)

但是,我不断收到错误消息:NotImageError/Empty image data.

并指这一行:

image = images.resize(request.POST.get('image'), 100, 100)
Run Code Online (Sandbox Code Playgroud)

我无法获取图像数据.好像它没有被上传,但我无法弄清楚原因.我的表单有enctype ="multipart/form-data"等等.我认为我所指的图像数据有些不对劲."request.POST.get('image')"但我无法弄清楚如何引用它.有任何想法吗?

提前致谢.

Hen*_*teg 9

经过"hcalves"的一些指导后,我发现了问题所在.首先,与App Engine捆绑在一起的Django的默认版本是0.96版本,从那时起框架处理上传文件的方式发生了变化.但是,为了保持与旧版应用程序的兼容性,您必须明确告诉App Engine使用Django 1.1,如下所示:

from google.appengine.dist import use_library
use_library('django', '1.1')
Run Code Online (Sandbox Code Playgroud)

您可以在app引擎文档中阅读更多相关信息.

好的,所以这是解决方案:

from google.appengine.api import images

image = request.FILES['large_image'].read()
recipe.large_image = db.Blob(images.resize(image, 480))
recipe.put()
Run Code Online (Sandbox Code Playgroud)

然后,为了从数据存储区再次提供动态图像,为这样的图像构建处理程序:

from django.http import HttpResponse, HttpResponseRedirect

def recipe_image(request,key_name):
    recipe = Recipe.get_by_key_name(key_name)

    if recipe.large_image:
        image = recipe.large_image
    else:
        return HttpResponseRedirect("/static/image_not_found.png")

    #build your response
    response = HttpResponse(image)
    # set the content type to png because that's what the Google images api 
    # stores modified images as by default
    response['Content-Type'] = 'image/png'
    # set some reasonable cache headers unless you want the image pulled on every request
    response['Cache-Control'] = 'max-age=7200'
    return response
Run Code Online (Sandbox Code Playgroud)