2010-09-01 71 views
21

Tôi đang phát triển một ứng dụng django và theo thời gian, các URL đã phát triển. Tôi có rất nhiều người trong số họ với tôi bây giờ và do một số thay đổi tôi đã thực hiện, một cái nhìn bắt đầu bị trục trặc. Khi tôi cố gắng để GET http://example.com/foo/edit_profile, đó là nghĩa vụ phải thực hiện một cái nhìn xem chức năng nhất định X nhưng nó thực hiện Y thay thế. Một nơi nào đó định tuyến url là rối tung lên và tôi không thể tìm ra nó. Tôi đã sử dụng phương thức django.core.urlresolvers.resolve để thử nó từ trình bao và tôi có thể xác nhận rằng URL đang được giải quyết sai. Tuy nhiên, tôi không biết làm thế nào để gỡ lỗi này và xác định vấn đề. Lý tưởng nhất, tôi muốn nhìn thấy một cái gì đó như "thử nghiệm mô hình này", "thử nghiệm mô hình này" vv cho đến khi nó cuối cùng đã tìm thấy một trong những chính xác và sau đó tôi có thể nhìn xung quanh nơi nó được giải quyết. Các tính năng chính của nó là:. Tôi không thể tìm thấy bất cứ điều gì như thế này.Trình gỡ lỗi url Django

Đây có phải là vấn đề thường gặp đối với các dự án lớn hơn không? Mọi người làm gì?

Cập nhật

tôi biết làm thế nào hệ thống hoạt động và làm thế nào để xem xét thông qua các URL từng cái một. Đó là những gì tôi đang cố gắng làm. Câu hỏi này về cơ bản là yêu cầu một phím tắt.

+0

Tôi chưa thấy một tập hợp các URL phức tạp này. My 'urls.py' có xu hướng bao gồm, mỗi cái có tiền tố riêng (ví dụ'^foo' sẽ bao gồm các URL trong ứng dụng 'foo', vì vậy tôi có thể đến đó để tìm ra vị trí phù hợp tiếp theo Nếu bạn gặp phải vấn đề này, 'urls.py' của bạn có thể quá phức tạp. Chúng tôi có thể giúp bạn tìm ra điều gì sai nếu bạn đăng ... –

+1

Thực ra, tôi (và tất cả những người khác) đã nhìn thấy) là tất cả "namespaced" (một tiền tố duy nhất theo sau là một bao gồm) .Đối với một số lý do mặc dù, một trong những foo/URL của tôi được chuyển đến thanh/ứng dụng và trả về một cái gì đó từ đó. một trình gỡ rối để chỉ cho tôi biết thứ tự độ phân giải đã được cố gắng để tôi có thể xác định được vấn đề. –

Trả lời

26

anh đã thử để chạy

manage.py show_urls 

sau khi cài đặt django_extensions?

http://vimeo.com/1720508 - xem từ 06:58.

Điều này sẽ cung cấp cho bạn thứ tự độ phân giải url được cố gắng.

Hy vọng điều này sẽ giúp

+0

Thú vị ... Tôi không biết điều này. Cảm ơn! –

+1

Ý tưởng hay. Đừng quên bạn cần phải thêm django_extensions để installed_apps trước khi bạn cố gắng sử dụng nó https://django-extensions.readthedocs.org/en/latest/installation_instructions.html – glaucon

0

Xem urlconfs của bạn, tìm urlpattern nào gọi ra chế độ xem Y của bạn và xem liệu regexp có chung chung hơn không. Hãy thử để nhận xét ra các urlpattern gây ra các trận đấu giả và xem nó phù hợp một cách chính xác X.

Thông thường, đây không phải là một vấn đề đối với tôi, nhưng nó xảy ra. Luôn giữ các mẫu cụ thể hơn trước các mẫu chung. Sử dụng tiền tố tĩnh để chia không gian tên url của bạn, để ngăn các kết quả trùng khớp sai.

+0

Điều này sẽ bị mất thời gian với số lượng lớn URL và regexps mà tôi hiện có. Đó là những gì tôi đang làm ngay bây giờ nhưng tôi ' d muốn có "trình gỡ lỗi URL" phong nha hơn là toàn bộ công việc nhận xét và nhận xét này trong các dòng từ các tệp url khác nhau. –

0

Bạn có thể giả định rằng nó đi qua các mẫu url từ trên xuống dưới và cột đầu tiên phù hợp sẽ được thực thi.

Như bạn đã biết mà nhìn được thực hiện (Y) nghĩ về điều đó:

  • nếu Y là trước X: các mô hình của Y phù hợp với url (nhưng không nên)
  • nếu X là trước Y: các mẫu của X không khớp với url (nhưng nên)

Bạn có thể cung cấp một số ví dụ rõ ràng hơn về URLConf của mình không? Hơn tôi có thể cung cấp cho bạn một câu trả lời rõ ràng hơn.

+0

Chúng điển hình. Tương tự như những gì Dominic nói. Tôi biết làm thế nào họ làm việc và hai điểm của bạn là tốt. Nó chỉ là nó tẻ nhạt đi qua những điều bằng tay khi cố gắng để có được một sửa chữa đó là lý do tại sao tôi đang tìm một trình gỡ lỗi. –

+0

Bạn luôn có thể đặt một số dòng in vào nguồn django, nếu bạn thực sự nghĩ rằng nó sẽ giúp bạn. Nó sẽ chỉ cho bạn thấy rằng nó chính xác đi từ trên xuống dưới và cố gắng để phù hợp với mọi regex cho đến khi nó phù hợp. MAybe đây: http://code.djangoproject.com/browser/django/trunk/django/core/urlresolvers.py#L143 –

+0

Đó là những gì tôi đang làm. :) –

3

Tôi sẽ nhận xét các mẫu trong url.py của bạn cho đến khi bạn gặp lỗi 404 khi bạn cố điều hướng đến foo. Nếu mẫu đó là một bao gồm, tôi sẽ recurse xuống đó và nhận xét ra dòng trong url.py. Cuối cùng bạn sẽ biết chính xác mẫu nào phù hợp.

Sau đó, tôi sẽ có chức năng xem mà nó đang gọi và mã cứng đó. Nếu nó đang sử dụng một cái nhìn chung hoặc một cái gì đó tinh tế, tôi sẽ làm cho nó rõ ràng và trực tiếp nhất có thể. Tại thời điểm đó, bạn nên biết quy tắc nào phù hợp và tại sao và mã nào đang thực thi trong chế độ xem.

+0

Hmm. Ừ. Nó sẽ hơi chậm nhưng hoàn toàn khả thi. –

+0

Được rồi, làm thế nào về điều này: nhận xét * tất cả * mẫu url cấp cao nhất của bạn và sau khi bạn xác nhận bằng 404, bật lại một mẫu bạn cho là đang được sử dụng. Nếu bạn sai, bạn học điều gì đó. Nếu bạn đúng, hãy đi sâu vào đó bao gồm (giả sử nó là một bao gồm) và bình luận ra tất cả ngoại trừ những gì bạn nghĩ đang được sử dụng. Với phím tắt này, bạn sẽ mất từ ​​5 đến 10 phút để tìm hiểu xem mã bạn muốn sử dụng có đang được sử dụng hay không. – hughdbrown

Các vấn đề liên quan