GAE图像通过Django表格发布到数据存储区

时间:2009-11-23 20:12:43

标签: python django google-app-engine google-cloud-datastore

我正在开展一个小方案项目,涉及将头像发布到用户个人资料页面,看起来很直接。我按照GAE网站上“Using the Images Python API”的说明操作。

他们提供的样本似乎不适用于Django。在这里搜索,我找到了一个类似问题的线程,但表示解决方案来自使用更新版本的Django和GAE。我试图避免这种工作,并使用内置API运行它。我是Python和Django的新手,但是从我可以收集的内容来看,图像没有正确地发布到转换图像并将其发送到数据存储区的函数中。这是我的代码:

def post(self):
    contacts = Contact()

    if users.get_current_user():
        contacts.owner = users.get_current_user()
    else:
        self.redirect('/')

    contacts.fname = self.request.get('fname')
    contacts.lname =  self.request.get('lname')
    contacts.pnum = self.request.get('pnum')

    img = self.request.FILES['file'].read()
    img.resize(32,32)

    contacts.avatar = db.Blob(images.resize(img,32,32))
    contacts.put()
    self.redirect('/')

除头像字段外,所有其他字段都已正确添加。修改后的请求字符串来自前面提到的包含修复的线程。当试图访问头像,这有点奇怪,页面显示一个破碎的图像,而不是我设置的默认图像。这让我相信,尽管该字段为空或缺失,但在请求时仍有一些东西可以绘制一个唯一的密钥。这是显示图像功能:

class Image (webapp.RequestHandler):
def get(self):
    contacts = db.get(self.request.get("img_id"))

    if contacts.avatar:
        image = contacts.avatar
        self.response.headers['Content-Type'] = "image/png"
        self.response.out.write(HttpResponseRedirect(contacts.avatar))
    else:
        self.response.out.wrute(HttpResponseRedirect("/static/image_not_found.gif"))

我尝试使用它时尝试了许多不同的变体,所以请相信我最初使用说明中的代码块。

非常感谢任何帮助。

提前致谢。

3 个答案:

答案 0 :(得分:1)

在您的图片投放代码中,您正在写出重定向,重定向的“网址”是图片数据 - 例如,您将用户重定向到“%PNG ...”。您需要直接写出响应数据。

除此之外,什么是HttpResponseRedirect?它不是webapp框架的一部分。

另外,您是否检查过数据存储区查看器以查看图像是否正确上传?尝试在上传图像之前对图像进行哈希处理,并将其与您在数据存储区中看到的哈希值进行比较(首先删除调整大小调用)。它是一样的吗?

答案 1 :(得分:0)

以下行不适用于Django 0.96,这是GAE的默认版本:

img = self.request.FILES['file'].read()

我之前发过类似问题的人(我认为这是你所指的主题:Storing Images on App Engine using Django

在您的问题中,您提到您不想使用较新版本的Django,因为它是一种“解决方法”。我认为你所缺少的是他们的谷歌应用引擎已经安装了Django 1.0和1.1,他们只是做了它,所以你必须明确指定你想要运行的版本,以避免破坏首次部署的应用程序在0.96。

您不必将整个django库包含在您的部署中。您只需更改引导文件即可告诉App Engine您说:

import django

你想让它交给你Django 1.1。

您可以在此处详细了解:http://code.google.com/appengine/docs/python/tools/libraries.html

但是,如果您在该其他线程中描述的解决方案,它将起作用:Storing Images on App Engine using Django

希望有所帮助。

答案 2 :(得分:0)

这是我的代码:

        if 'image' in request.FILES:
            imageFile = request.FILES['image'] #in forms.py: image  = forms.FileField(required=False)
            fileSize = imageFile.size  
            fileType = imageFile.content_type 
            filename = imageFile.name


            cPhoto = CarPhoto(car=car)
            cPhoto.content = db.Blob(imageFile.read())    
            cPhoto.filename = User.objects.make_random_password(32) +'.jpg'                         
            cPhoto.put()

然后我显示这样的图像:

def show_car_photo(request,filename):

cPhoto = CarPhoto.gql('Where filename=:filename', filename=filename).get()
if cPhoto is None:
    return HttpResponse(filename + ': Image Not Found')

response = HttpResponse(mimetype="image/jpeg")
response.content = cPhoto.content
return response