基于AJAX的动态图像服务 - Google App Engine Python 2.7

时间:2012-10-29 01:06:18

标签: ajax image google-app-engine python-2.7

Google提供的有关使用GAE动态投放图片的说明如下:https://developers.google.com/appengine/articles/python/serving_dynamic_images 唯一的问题是这个方法不使用AJAX,我认为它没有我想象的那么高效。

我正在尝试使用AJAX和GAE Python 2.7动态地提供多个图像,但我现在专注于服务一个。

Python服务器端代码:

class GetImage(webapp2.RequestHandler):
    def get(self):
        problem = Problem.all()[0]
        if(problem and problem.prompt_image):
            self.response.headers['Content-Type'] = "image/png"
            self.response.out.write(problem.prompt_image)

客户端AJAX代码:

$.ajax({
    url: "/img",
    type: "POST",
    dataType: "html",
    success: function(msg){
        $("#right").append("<img>"+msg+"</img>");
    }
});

我面临的问题是我不知道如何通过AJAX将blobstore内容提供给DOM。有人能指出我正确的方向吗?

谢谢!

编辑:voscausa的解决方案似乎走在了正确的轨道上。但是,它需要一个blob_key。我的模型如下:

class Problem(db.Model):
    prompt_image = db.BlobProperty()

我似乎无法弄清楚如何从db.BlobProperty获取Blob密钥。这可能吗?

2 个答案:

答案 0 :(得分:1)

使用GET从blobstore提供图像:

http://{{ your_appid }}.appspot.com/imgserve/{{ blob_key }}

从blobstore提供图片的代码:

class ImgServe(blobstore_handlers.BlobstoreDownloadHandler):

    def get(self, blob_key):                                       

    blob_info = blobstore.BlobInfo.get(blob_key)     
    self.send_blob(blob_info, save_as=True)


app = webapp2.WSGIApplication(
                          [
                           ('/imgserve/([^/]+)?', ImgServe),
                          ], debug=True)   

答案 1 :(得分:1)

这个问题给了我一个真正的头痛。感谢大家,特别是voscausa,他让我走上正确的道路来获得解决方案。那里有很多旧材料,这是我使用的解决方案: https://developers.google.com/appengine/docs/python/blobstore/overview#Uploading_a_Blob (参见完整的样本申请)

import os
import urllib
import webapp2

from google.appengine.ext import blobstore
from google.appengine.ext.webapp import blobstore_handlers

class MainHandler(webapp2.RequestHandler):
  def get(self):
    upload_url = blobstore.create_upload_url('/upload')
    self.response.out.write('<html><body>')
    self.response.out.write('<form action="%s" method="POST" enctype="multipart/form-data">' % upload_url)
    self.response.out.write("""Upload File: <input type="file" name="file"><br> <input type="submit"
        name="submit" value="Submit"> </form></body></html>""")

class UploadHandler(blobstore_handlers.BlobstoreUploadHandler):
  def post(self):
    upload_files = self.get_uploads('file')  # 'file' is file upload field in the form
    blob_info = upload_files[0]
    self.redirect('/serve/%s' % blob_info.key())

class ServeHandler(blobstore_handlers.BlobstoreDownloadHandler):
  def get(self, resource):
    resource = str(urllib.unquote(resource))
    blob_info = blobstore.BlobInfo.get(resource)
    self.send_blob(blob_info)

app = webapp2.WSGIApplication([('/', MainHandler),
                               ('/upload', UploadHandler),
                               ('/serve/([^/]+)?', ServeHandler)],
                              debug=True)