Python 从google应用程序引擎ndb获取图像

Python 从google应用程序引擎ndb获取图像,python,image,google-app-engine,google-cloud-datastore,app-engine-ndb,Python,Image,Google App Engine,Google Cloud Datastore,App Engine Ndb,是否有人可以验证/更正我访问作为ndb.Model类一部分的映像的方法 这是我的主页处理程序: class MainPage(webapp2.RequestHandler): def get(self): guestbook_name = self.request.get('guestbook_name', DEFAULT_GUESTBOOK_NAME) greetings_query = Greeti

是否有人可以验证/更正我访问作为ndb.Model类一部分的映像的方法

这是我的主页处理程序:

class MainPage(webapp2.RequestHandler):

def get(self):
    guestbook_name = self.request.get('guestbook_name',
                                      DEFAULT_GUESTBOOK_NAME)
    greetings_query = Greeting.query(
        ancestor=guestbook_key(guestbook_name)).order(-Greeting.date)
    greetings = greetings_query.fetch(10)

    template_values = {
        'greetings': greetings,
        'guestbook_name': urllib.quote_plus(guestbook_name),
    }

    template = JINJA_ENVIRONMENT.get_template('index.html')
    self.response.write(template.render(template_values))
class Image(webapp2.RequestHandler):
def get(self):
    greeting = ndb.get(self.request.get('key_id'))
    if greeting.avatar:
        self.response.headers['Content-Type'] = 'image/png'
        self.response.out.write(greeting.avatar)
        self.response.write('it works')
    else:
        self.error(404)
        self.response.out.write('No image')
这是我的index.html模板代码:

{% for greeting in greetings %}
  <div><img src="/img?key_id={{ greeting.key.id() }}" />
  </div>
{% endfor %}
我的想法是在我的问候NDB模型中将我的图像存储在一个blob中。然后,我尝试通过使用调用我的图像处理程序的主页面处理程序填充主页面来获取该图像。我通过模板传递特定的ndb条目键,然后在图像处理程序中从模板中检索该键。然后,我尝试通过使用键获取ndb条目来显示blob属性。 以下是错误跟踪:


您加载数据的方式不起作用,您写道:

greeting = ndb.get(self.request.get('key_id'))
如异常所示,模块(
ndb
)没有
get
方法,即使有方法,它怎么知道要查找的模型?正确的方法是:

greeting_id = int(self.request.get('key_id'))
greeting = Greeting.get_by_id(greeting_id)
请注意,我们正在将
key\u id
转换为一个整数,您不会详细介绍如何分配id,但很可能它是自动生成的,因此是一个整数;如果按原样使用请求数据,数据库将无法找到它(请求数据始终是一个字符串,确切地说)

此外,编写响应的正确方法如下:

self.response.write(greeting.avatar)
如你所知。使用
out
是“过时的”(来自旧框架),仅出于兼容性目的才受支持,最终也是一样的,因此,向它写入两次实际上会损坏图像数据

如果需要调试信息,应使用更合适的方法:

import logging
logging.info('it works')
以下评论的解决方案:

guestbook_name = self.request.get('guestbook_name', DEFAULT_GUESTBOOK_NAME)
greeting_id = int(self.request.get('key_id'))
greeting = Greeting.get_by_id(greeting_id, parent=guestbook_key(guestbook_name))

使用:self.request.GET('key_id'))谢谢!虽然我现在得到一个不同的错误,说“问候语”是一个非类型对象。我是不是存储错误了?我觉得我真的很接近。。。从本地数据存储中,我看到我上传的图像存储为二进制,我假设这意味着上传工作正常。剩下的就是找回它。为什么我要检索一个没有的对象?我看到您正在使用祖先查询问候语,所以在获取问候语时可能需要使用它,例如:
Greeting.get\u by\u id(Greeting\u id,parent=guestbook\u key)