我正在开展一个小方案项目,涉及将头像发布到用户个人资料页面,看起来很直接。我按照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"))
我尝试使用它时尝试了许多不同的变体,所以请相信我最初使用说明中的代码块。
非常感谢任何帮助。
提前致谢。
答案 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