AppEngine/Python,查询数据库并通过单个 GET 请求向客户端发送多张图片

0 投票
4 回答
875 浏览
提问于 2025-04-15 17:38

我正在开发一个社交网络类型的应用程序,想要在用户发出一个请求时,把多张图片发送给客户端。具体来说,当用户加载页面时,他们应该能看到所有与他们账户相关的图片。

我在服务器端使用Python,而在客户端想用JavaScript/JQuery来解码和显示收到的图片。

问题在于,我希望在服务器端只进行一次查询(也就是查询与一个用户相关的所有图片),然后把查询到的所有图片作为一个整体发送给客户端,客户端再把这些图片分开。理想情况下,我想用类似JSON的东西,但虽然JSON可以发送多个“对象”作为响应,但似乎不支持直接发送多张图片(或二进制文件)作为JSON响应。

我是否应该考虑其他方法来解决这个问题,或者是否有其他技术可以让我在一次请求中发送多张图片给客户端呢?

谢谢,祝好
亚历山大

4 个回答

0

一次性把所有图片的链接发给客户端,然后让客户端自己处理。这种做法符合协议的设计,而且只需要发一次请求。如果运气好的话,客户端可能会在下一个请求中把这些链接传回来。不过有个好处是,即使因为某些原因(通常是中间的代理出问题了)客户端不能重用连接,这种方法还是能最终奏效。

1

作为对Alex回答的改进,其实不需要使用memcache。你只需要做一个只查询键的操作,获取你想发送给客户端的图片的键的列表。然后,对于每个图片请求,使用db.get()来获取对应键的图片。这和进行一次普通查询所需的工作量差不多。

2

关于App Engine的部分其实没什么大问题,只要图片数量和总大小没有超过GAE的限制就行。不过,用户的浏览器可能不知道怎么处理每次GET请求要接收多个数据包,因为这不是网页的正常工作方式。我想你可以把所有的数据块和需要的元数据(这些是帮助客户端重新组合数据的)合在一起,然后发送这个“超级数据包”。不过,这个数据包还是得和你发送的HTML、CSS、JavaScript分开。你还得让JavaScript把这个超级数据包拆分成需要的图片。不过这部分你最好另开一个问题,并标记为JavaScript,因为Python和这没什么关系,而GAE也没有关系。

我建议你接受一个事实:浏览器(你提到的可能是通过ajax)发送多个请求,就像它对其他网页一样。你可以把重点放在优化服务器端上,因为这些请求的时间会非常接近,所以你可以使用memcache来保存那些还没发送的图片,这样就能避免在GAE应用中多次从存储中获取数据。

撰写回答