2009-10-14 41 views
5

支持django中資源(​​例如博客,用戶)的多重表示(例如html,json,xml)的常見約定是什麼?內容類型和表示形式

首先,我不知道如何格式化我的網址。例如,什麼你對使用這兩種URL的請求XML格式

  • /<resource>.<format>,例如/blogs/123.xml
  • /<format>/<resource>,例如, /xml/blogs/123
  • /<resource>?format=<format>,例如, /blogs/123?format=xml

我應該僅僅依靠Content-Type傳遞參數嗎?如何擁有多種移動表示形式(例如iPhone,手機,掌上電腦)和全面的瀏覽器表示形式?

視圖怎麼樣?沒有大量if語句或重複代碼的情況下選擇正確模板的慣例是什麼?

回答

7

我可以做什麼,如果這是需要解決,就是:

  • 你的意見查找Accept頭(我認爲這就是你在談論),並決定要發送的內容類型回基於Accept標題。
  • 您有一箇中間件,它在Request-URI中查找擴展,將其刪除,並將關聯的內容類型添加到請求Accept標頭中。

對於此解決方案,URL中的內容類型將始終表示爲關聯的文件擴展名,既不是查詢字符串的一部分,也不是資源名稱的一部分。但是除了瀏覽器生成的請求之外,內容類型應該通過Accept標題進入

所以請求到達爲:

GET /blogs/123.xml HTTP/1.1 
Host: example.com 

中間件轉換,爲:

GET /blogs/123 HTTP/1.1 
Host: example.com 
Accept: application/xml 

你的觀點認爲application/xml並返回XML內容的響應。

+0

這是一個整潔的想法。 –

+0

整潔(和+1) - 但你可以提供一些示例視圖代碼?這種風險不會因爲內容類型而導致許多開關亂丟視圖代碼?我無法立即想到圍繞它的優雅方式,但我有興趣看看是否有其他人可以。 –