2010-12-21 29 views
2

我有一種情況,我基本上允許任何URL,沒有前綴;我一直在考慮設計它的一種方式,基本上有兩個''匹配 - 第一個將會看到它是否可以滿足要求,如果不能滿足要求,則會落到第二個。Django URLConf中的「Fallthrough」?

  • 如果我raise Http404從第一視角,我得到一個404頁。

  • 如果我return,我得到一個ValueError抱怨我「沒有返回一個HttpResponse對象。」

django.core.urlresolvers代碼看簡單地說,我相當確信架構根本不到位,做到這一點 - 它解析爲一個單一的比賽,該URL解析階段是從視圖完全獨立階段,一旦你進入了視圖,就不會返回到URL解析階段。它是否正確?我個人認爲這是一個輕微的缺陷;我可以看到,如果有兩種類型的404--其中一種說「不,它不存在」,如現在這樣做,還有一種說「我不知道它」,這會使它看起來很有用通過進一步的URLConf。在我看來,像任何人想要這種系統的風格基本上都必須替換Django的URL解析部分。我已經解決了這個問題(基本上把一個簡單的視圖放在一個,然後另一個視圖),所以我不認爲我真的有任何需要這個特殊的東西了,但我仍然是這樣, m好奇,如果有這樣做,我只是沒有發現,或者是否可能有一個整潔的解決方法。

回答

0

我認爲你在末尾提到的解決方法是在Django中這樣做的正確方法。它是視圖合約的一部分,它必須返回一個HttpResponse,所以沒有辦法避免這種情況。

+1

不完全;他們可以'提高Http404'。我想要'raise URLNotResolved'這樣的東西來告訴它繼續打獵,但我不認爲它存在於任何地方。 – 2010-12-22 05:54:00

0

我不知道你爲什麼在這裏有兩個看法。當然,你真的只有一種觀點,可以做兩件事(甚至更多)。改變你的看法功能如下:

if canDoMethod1(request): 
    doMethod1(request) 
else: 
    doMethod2(request) 

或其他。這會在任何網址上觸發。排序。

+0

對於我自己,我現在可以做到這一點(正如我在最後一段中提到的那樣),但我只是覺得能夠以另一種方式做到這一點會更合適。必須有人們這樣做的情況 - 「試試:......;除了Http404:...' - 其中一些'引發URLNotResolved'可能更簡潔。 – 2010-12-22 06:13:58

+0

你總是可以自己定義一個新的URLNotResolved異常,並讓你的視圖在try/except結構中捕獲。雖然它可能會變得混亂,與一堆嵌套嘗試1 /除了嘗試2 /除了事情。 – Spacedman 2010-12-22 09:38:53