2010-09-01 30 views
21

我正在開發一個django應用程序,隨着時間的推移,URLs已經增長。我現在有很多人和我在一起,由於我做了一些改變,一種觀點開始出現故障。當我嘗試GET http://example.com/foo/edit_profile時,它應該執行一個視圖某個查看功能X,但它正在執行Y。網址路由被搞亂了,我無法弄清楚。我使用django.core.urlresolvers.resolve方法從shell中嘗試它,並且我可以確認該URL得到錯誤解決。但是,我不知道如何調試並找出問題所在。Django的url調試器

理想情況下,我希望看到像「測試此模式」,「測試此模式」等等,直到它最終找到正確的一個,然後我可以查看它解決的位置。我找不到像這樣的東西。

這不是大項目的常見問題嗎?人們做什麼?

更新

我知道系統是如何工作的,以及如何通過網址逐一看看。這就是我想要做的。這個問題基本上是要求一個捷徑。

+0

我還沒有看到一組這樣複雜的URL。我的'urls.py'往往有一堆包含,其中每一個都有它自己的唯一前綴(例如'^ foo'將在'foo'應用中包含URL,所以我可以去那裏找出下一場比賽的位置如果你遇到這個問題,你的'urls.py'可能太複雜了,如果你發佈它,我們可能會幫你弄清楚什麼是錯誤的... – 2010-09-01 08:48:52

+1

其實,我的(和其他所有的我(已見過)都是「名稱空間」(一個唯一的前綴後跟一個包含),但由於某種原因,我的一個foo/URL被路由到了酒吧/應用程序並從那裏返回了一些東西。一個調試器只是告訴我按照什麼樣的順序進行分辨率的嘗試,以便我能夠明確問題 – 2010-09-01 09:07:42

回答

26

你已經嘗試安裝django_extensions後運行

manage.py show_urls 

http://vimeo.com/1720508 - 從06:58觀看。

這應該給你以什麼順序的url解析嘗試。

希望這可以幫助

+0

有趣...我沒有意識到這一點。謝謝! – 2010-12-30 09:26:45

+1

好主意。在嘗試使用它之前,不要忘記您需要將django_extensions添加到installed_apps中https://django-extensions.readthedocs.org/en/latest/installation_instructions.html – glaucon 2015-02-01 08:41:44

0

看看你的urlconfs,找到哪個urlpattern調用你的視圖Y,看看這個正則表達式是否比它應該更普遍。嘗試註釋掉導致錯誤匹配的urlpattern,看它是否正確匹配X.

通常,這對我來說不是問題,但它確實發生。始終在一般模式之前保留更具體的模式。使用靜態前綴來劃分你的url命名空間,以防止錯誤匹配。

+0

由於我現在有大量的URL和正則表達式,所以這個過程非常耗時,這是我現在正在做的,我喜歡有一個體面的「URL調試器」,而不是整個評論和評論各種url文件。 – 2010-09-01 07:59:06

0

你可以假設它從上到下經歷了urlpatterns,第一個匹配的將被執行。

正如你知道哪個是執行視圖(Y)想一想:

  • 如果YX前:Y的模式的URL匹配(但是不應該)
  • 如果X是前Y:X的模式與url不匹配(但應該)

您能提供一些更明確的URLConf示例嗎?比我能給你一個更明確的答案。

+0

他們很典型。類似Dominic所說的。我知道他們是如何工作的,你的兩點都很好。只是在嘗試獲取修復程序時手動執行此操作非常繁瑣,這就是我尋找調試器的原因。 – 2010-09-01 10:33:16

+0

如果您真的認爲它對您有幫助,您可以隨時在django源文件中添加一些打印行。它只會告訴你,它完全從上到下,並試圖匹配每個正則表達式直到它匹配。可能在這裏:http://code.djangoproject.com/browser/django/trunk/django/core/urlresolvers.py#L143 – 2010-09-01 11:03:58

+0

這就是我正在做的。 :) – 2010-09-01 19:40:08

3

我會將url.py中的模式註釋掉,直到您嘗試導航到foo時出現404錯誤。如果這種模式是一個包含,我會緩解,並註釋掉url.py中的行。最終你會確切知道哪種模式匹配。

然後,我會把它正在調用的視圖函數和硬編碼。如果它使用的是通用視圖或者其他細微的東西,我會盡可能地明確和直接。此時,您應該知道哪些規則匹配,以及它在視圖中執行的原因和代碼。

+0

嗯。是啊。它會有點慢,但可行。 – 2010-10-21 03:58:08

+0

好的,這個怎麼樣:註釋掉所有*你的頂級url模式,並且在你用404確認之後,重新啓用你認爲正在使用的模式。如果你錯了,你會學到一些東西。如果你是對的,深入研究,包括(假設它是一個包含)並且註釋掉除了你認爲正在使用的所有內容。有了這個快捷方式,它應該花費你五到十分鐘的時間來確定你想使用的代碼是否被使用。 – hughdbrown 2010-10-21 04:17:31