【问题标题】:GAE Image Posting to Datastore through Django Form通过 Django 表单将 GAE 图像发布到数据存储区
【发布时间】:2009-11-23 20:12:43
【问题描述】:

我正在做一个涉及将头像发布到用户个人资料页面的小项目,这看起来很简单。我正在按照 GAE 网站上“Using the Images Python API”的说明进行操作。

他们提供的示例似乎不适用于 Django。在这里搜索,我发现了一个有类似问题的线程,但说解决方案来自使用带有 GAE 的较新版本的 Django。我试图避免这种工作,并使用内置 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"))

在尝试使其正常工作时,我尝试了许多不同的变体,因此请相信我最初确实使用了说明中的代码块。

非常感谢任何帮助。

提前致谢。

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      以下行在 Django 0.96 中不起作用,这是 GAE 的默认版本:

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

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

      在您的问题中,您提到您不想使用更新版本的 Django,因为它是一种“解决方法”。我认为您缺少的是他们的 Google App Engine 已经安装了 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

      希望对您有所帮助。

      【讨论】:

        【解决方案3】:

        这是我的代码:

                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(请求,文件名):

        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
        

        【讨论】:

          猜你喜欢
          • 2020-06-12
          • 2014-06-20
          • 2017-03-14
          • 2015-03-17
          • 2021-08-11
          • 2014-05-07
          • 2012-06-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多