【问题标题】:Fetching an image from google app engine ndb从谷歌应用引擎 ndb 获取图像
【发布时间】:2015-02-20 18:41:53
【问题描述】:

有人可以验证/更正我访问属于 ndb.Model 类的图像的方法吗?

这是我的 MainPage 处理程序:

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))

这是我的 index.html 模板代码:

{% for greeting in greetings %}
  <div><img src="/img?key_id={{ greeting.key.id() }}" />
  </div>
{% endfor %}

这是我的图像处理程序:

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')

我的想法是将图像存储在 Greeting NDB 模型中的 blob 中。然后,我尝试通过使用调用我的 Image 处理程序的 MainPage 处理程序填充主页来获取该图像。我通过我的模板传递特定的 ndb 条目键,然后从图像处理程序中的模板中检索键。然后我尝试通过使用键获取 ndb 条目来显示 blob 属性。 这是错误跟踪:

【问题讨论】:

标签: python image google-app-engine google-cloud-datastore app-engine-ndb


【解决方案1】:

您的加载数据的方式不起作用/无法正常工作,您写道:

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_id 转换为整数,您不会详细说明 id 是如何分配的,但很可能它是自动生成的,因此是整数;如果您按原样使用请求数据,数据库将无法找到它(请求数据始终是字符串,字面意思)。

另外,写响应的正确方法是这样的:

self.response.write(greeting.avatar)

您可以阅读here in the docs。使用 out 是“过时的”(来自旧框架),仅出于兼容性目的而支持,并且最终是相同的,因此通过两次写入它实际上会破坏图像数据。

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

import logging
logging.info('it works')

以下cmets的解决方法:

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))

【讨论】:

  • 谢谢!虽然我现在得到一个不同的错误,说'greeting'是一个 NoneType 对象。我存储不正确还是什么?我觉得我真的很接近......从本地数据存储中,我看到我上传的图像存储为二进制文件,我假设这意味着上传工作。剩下的就是找回它。为什么我检索的是 None 的对象?
  • 我看到您正在使用祖先来查询您的问候,因此在获取它们时可能需要使用它,例如:Greeting.get_by_id(greeting_id, parent=guestbook_key)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-26
  • 2014-09-03
  • 1970-01-01
  • 2011-05-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多