我正在尝试理解文档Using the Images Python API,我对如何获取密钥并显示头像感到困惑。
文档说明Image
处理程序将通过/img
路径提供图像。
我对这个Image
处理程序的作用感到困惑。我在下面评论如何理解它;请改正。感谢:
class Image (webapp.RequestHandler):
def get(self):
#get the key of the image "img_id" from datastore
#what is the value of "img_id"? Where does it come from?
#how does the app engine know to get what key for which image?
greeting = db.get(self.request.get("img_id"))
#what is greeting.avatar?
#is it img_id.avatar ?
#I assume "avatar" refers to the "avatar" property in the model
if greeting.avatar:
self.response.headers['Content-Type'] = "image/png"
#does this display the avatar?
#I thought the img tag displayed the avatar
self.response.out.write(greeting.avatar)
else:
self.error(404)
非常感谢你的帮助。
更新(重新:Gabi Purcaru回答)
再次感谢您的回答。我有一个显示用户评论的查询:
for result in results:
self.response.out.write("<li>")
self.response.out.write("<b>%s</b> %s " % (result.userName, result.userLatestComment))
self.response.out.write("</li>")
self.response.out.write("</ol></body></html>")
所以,我使用MainPage handler
中的图片代码复制该行self.response.out.write("<div><img src='img?img_id=%s'></img>" % greeting.key())
并更改
greeting.key()
到
result.key()
我认为,现在应该显示用户评论旁边的头像:
for result in results:
self.response.out.write("<li>")
self.response.out.write("<b>%s</b> %s " % (result.userName, result.userLatestComment))
self.response.out.write("<div><img src='img?img_id=%s'></img>" % result.key())
self.response.out.write("</li>")
self.response.out.write("</ol></body></html>")
但仍然不清楚为什么result.key()
是我想要显示的图像的关键?
答案 0 :(得分:3)
"img_id"
来自网址的GET部分(例如“www.example.com/img? img_id = 12312 ”)。引擎为数据库中的每个模型分配一个新的唯一键。
greeting.avatar
是具有键img_id
的模型的头像属性。因此,在某种意义上,您可以将其视为img_id.avatar
,尽管从技术上讲它是不正确的。
不显示头像,只是返回头像。让我们以通常的图像为例,让您更好地理解。当您编写<img src="some_link" />
时,浏览器会查找"some_link"
,并包含该图片。然后,浏览器将从文件系统中读取图像,并将其返回到浏览器。您的处理程序所做的是更改后端部分,以便Web服务器将从数据存储区(特别是avatar
属性)而不是常规文件返回映像。浏览器 - 以及用户 - 将其视为常规图像。
修改强>
result.key()
是数据库自动为您的模型提供的唯一标识符。你需要“告诉它”你刚才写的图像处理程序,因为它知道你需要哪个特定的模型头像。你可以通过为url设置img_id
GET变量(你刚才这样做)。
我不确定你是否理解整个.key()
的事情。让我解释一下:
任何数据库都需要从另一个记录中识别一条记录(在我们的例子中是模型)。这就是为什么他们将自动为插入数据库的每个记录分配一个新的,最重要的唯一标识符(在我们的例子中为键)。您必须为处理程序提供模型的键才能返回该模型的头像。
让我们以现实世界为例:你是众多人中的一员。您所在国家/地区唯一标识您的方式是通过某种SSN(社会安全号码)。在我的国家/地区,它是一个13位数的代码(例如1024582485008
)。如果我想获得驾照,我将提供我的名字,但这还不够 - 我不是我国唯一的Gabi Purcaru。我还必须提供我的SSN,它将准确地告诉我是谁。如果我们进行类比,你必须向处理程序提供模型的“SSN”(即密钥),以便它知道从数据库中获取哪个模型并返回它的化身。