正在从 google App Engine ndb 获取图像
Fetching an image from google app engine ndb
有人可以 verify/correct 我访问属于 ndb.Model class 的图像的方法吗?
这是我的 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 中。然后,我尝试通过使用调用我的图像处理程序的 MainPage 处理程序填充主页来获取该图像。我通过我的模板传递特定的 ndb 条目密钥,然后从图像处理程序中的模板检索密钥。然后,我尝试通过使用密钥获取 ndb 条目来显示 blob 属性。
这是错误跟踪:
你加载数据的方式't/can不起作用,你写道:
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
是 "outdated"(来自旧框架),仅出于兼容性目的而受支持,最终是同一件事,因此通过两次写入它实际上是在破坏图像数据。
如果你想要调试信息,你应该使用更合适的方法:
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))
有人可以 verify/correct 我访问属于 ndb.Model class 的图像的方法吗?
这是我的 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 中。然后,我尝试通过使用调用我的图像处理程序的 MainPage 处理程序填充主页来获取该图像。我通过我的模板传递特定的 ndb 条目密钥,然后从图像处理程序中的模板检索密钥。然后,我尝试通过使用密钥获取 ndb 条目来显示 blob 属性。 这是错误跟踪:
你加载数据的方式't/can不起作用,你写道:
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
是 "outdated"(来自旧框架),仅出于兼容性目的而受支持,最终是同一件事,因此通过两次写入它实际上是在破坏图像数据。
如果你想要调试信息,你应该使用更合适的方法:
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))