2010-01-05 18 views
0

我正在App Engine上的社交網絡類型的應用程序上工作,並且希望將多個圖像發送到基於客戶端在一個單一的獲取請求。特別是,當客戶端加載一個頁面時,他們應該看到與他們的賬戶相關聯的所有圖像。AppEngine/Python,查詢數據庫並向客戶端發送多個圖像作爲對單個獲取請求的響應

我在服務器端使用python,並希望在客戶端使用Javascript/JQuery來解碼/顯示接收到的圖像。

難度在於我只想在服務器端執行單個查詢(即查詢與單個用戶關聯的所有圖像),並將查詢產生的所有圖像作爲單個發送給客戶端單位,然後將其分解成單個圖像。理想情況下,我想使用類似於JSON的東西,但雖然JSON似乎允許將多個「對象」作爲JSON響應發送,但它似乎沒有允許發送多個圖像(或二進制文件)的能力作爲JSON響應。

有沒有另外一種方法,我應該看看這個問題,或者我應該考慮可能允許我向客戶端發送多個圖像的另一種技術,以響應單個獲取請求?

謝謝你,親切的問候 亞歷山大

+0

您是否在尋找CSS Sprites(http://www.alistapart.com/articles/sprites)的內容? AppEngine的難題在於創建包含所有精靈的圖像:PIL包不會有任何幫助。 – jldupont

+0

這不完全是我嘗試在單個響應中發送多個圖像的原因,但它仍然是一個有趣的鏈接。 Regards –

回答

2

App Engine部分沒什麼大問題(只要圖片的數量和總大小不超過GAE的限制),但用戶的瀏覽器不太可能知道該怎麼做才能接收到請求的每個GET多個有效載荷 - 這不僅僅是網絡的工作原理。我想你可以連接所有blob/bytestreams(連同客戶端重建它們所需的元數據)併發送(它仍然必須是HTML/CSS/Javascript的獨立有效載荷,您還要發送),只要你可以通過使用Javascript來將megablob再次分離成所需的圖像(但是對於那部分,你應該打開一個單獨的問題並標記爲Javascript,因爲Python與它無關,而GAE什麼都沒有)。

我反而建議只接受一個事實,即瀏覽器(可能是通過AJAX,只要在標籤註明)被髮送多個請求,只是因爲它沒有在WWW上的所有其他網頁,並集中精力優化服務端 - 請求將會非常接近,所以您應該只使用memcache來保留尚未發送的圖像,以避免在GAE應用程序中存儲多個從存儲請求中提取。

+0

嗨,亞歷克斯。是的,我想我可以使用memcache來緩存未發送的圖像。看起來像一個很好的解決方案。 謝謝! –

+0

嗨,Alex,你提到了「使用memcache,並且只是組成,並且作爲HTML /&c(第一個有效載荷)的一部分發送,緩存圖像的URL,因此瀏覽器將執行跟蹤。」.---澄清,您是否建議對查詢的第一個響應是包含URL的JSON對象,該對象將包含查詢產生的圖像,然後Javascript將解碼JSON,提取URL並在生成的URL處請求圖像? –

+0

@Alexander爲響應頁面的第一個GET請求(作爲「第一個有效載荷」)頁面的HTML(並且正如你非常想避免多個請求,我假設CSS和JS將混合到它中)。所以,我通常只是使用正確數量的'img' HTML標籤,圖片網址作爲其'src'屬性。但是,如果你真的非常熱衷於做AJAX,不管出於什麼原因,我想你可以將圖像URL作爲Javascript數組嵌入到AJAX從這些URL中獲取圖像的Javascript代碼旁邊。 –

0

試圖發送所有的圖像在一個請求,意味着你將對陣一些網頁和瀏覽器技術的基本假設的很辛苦的戰鬥。如果你沒有真正有說服力的理由去做,你應該考慮每個請求提供一個圖片。現在已經行得通,沒有汗水,沒有努力,沒有車輪改造。

我想不出一個明智的方法去做你想問的問題,但我可以告訴你,在試圖實施你所描述的解決方案時,你正在尋求痛苦。

+0

好的,謝謝你的信息。如果這是一種非標準的做事方式,那麼我會一次發送一個圖像。 將它們作爲一個組發送的動機是爲了避免多次查詢數據庫(因爲單個查詢可以返回與配置文件關聯的所有照片),或者需要服務器端跟蹤查詢結果並將一次一個結果。 –

+0

@Alexander,爲了避免多重查詢,使用memcache,並且只是組成,並作爲HTML /&c(第一個有效載荷)的一部分發送,緩存圖像的URL,因此瀏覽器將執行跟蹤。看到我的答案更詳細一點,評論總是有點狹隘。 –

0

發送一個命中中所有圖像的客戶端URL,並在客戶端進行處理。這符合協議的設計,並且仍然只允許您進行一個查詢。如果幸運的話,客戶端可以在接下來的請求中將這些請求返回給客戶端,但是整潔的事情是它會工作(最終),即使它由於某種原因無法重新使用連接(通常是被中斷代理方式)。

+0

嗨安德魯,實際上我能夠從一個URL請求所有圖像,但我不確定*如何將它們回傳。 關注 –

+0

我想Alex的答案有一些具體的答案。 –

1

作爲對Alex的回答的改進,不需要使用memcache:只需執行僅鍵查詢即可獲取要發送給客戶端的圖像鍵列表,然後使用db.get()獲取該圖像對應於每個圖像請求所需的鍵。這需要與單個常規查詢大致相同的工作量。

+0

嗨,尼克,很好的建議,謝謝! –

相關問題