Xác định cấu hình url Django hoàn chỉnh


82

Có cách nào để có được cấu hình url django hoàn chỉnh không?

Ví dụ: trang gỡ lỗi 404 của Django không hiển thị các cấu hình url đi kèm, vì vậy đây không phải là cấu hình hoàn chỉnh.


Trả lời : Cảm ơn Alasdair, đây là một đoạn mã ví dụ:

import urls

def show_urls(urllist, depth=0):
    for entry in urllist:
        print("  " * depth, entry.regex.pattern)
        if hasattr(entry, 'url_patterns'):
            show_urls(entry.url_patterns, depth + 1)

show_urls(urls.urlpatterns)

2
kịch bản rất hữu ích, thanks
RichVel

Câu trả lời:


49

Django là Python, vì vậy nội tâm là bạn của bạn.

Trong shell, nhập khẩu urls. Bằng cách lặp lại urls.urlpatternsvà tìm hiểu kỹ càng nhiều lớp cấu hình url đi kèm càng tốt, bạn có thể xây dựng cấu hình url hoàn chỉnh.

import urls
urls.urlpatterns

Danh sách urls.urlpatternschứa RegexURLPatternRegexURLResolvercác đối tượng.

Đối với một RegexURLPatternđối tượng, pbạn có thể hiển thị biểu thức chính quy với

p.regex.pattern

Đối với một RegexURLResolverđối tượng q, đại diện cho cấu hình url được bao gồm, bạn có thể hiển thị phần đầu tiên của biểu thức chính quy với

q.regex.pattern

Sau đó sử dụng

q.url_patterns

sẽ trả về một danh sách RegexURLResolverRegexURLPatterncác đối tượng khác.


3
Ý tưởng tốt! Tôi đã tạo một tập lệnh đơn giản tại đây: code.activestate.com/recipes/576974
Michael

Đó là một chức năng thanh lịch. Tôi bắt đầu cố gắng viết một cái, nhưng nó liên quan đến việc kiểm tra các loại đối tượng để xem chúng có RegexURLPatternhay không RegexURLResolver. Sử dụng has_attrlà một ý tưởng tốt hơn nhiều. Bạn nên đặt hàm của mình trong câu trả lời tại đây trên Stack Overflow. Tôi muốn ủng hộ nó.
Alasdair

điều này gây ra rất nhiều vấn đề nhập theo chu kỳ thông qua tệp cài đặt !!
NoobEditor

67

Phần mở rộng Django cung cấp một tiện ích để thực hiện việc này dưới dạng lệnh management.py.

pip install django-extensions

Sau đó, thêm django_extensionsvào INSTALLED_APPS của bạn trong settings.py. sau đó từ bảng điều khiển chỉ cần nhập như sau

python manage.py show_urls

2
Tiện dụng! Tôi không nghĩ rằng tôi đã từng phát hiện ra điều này. Cảm ơn!
Tim Ruddick

6

Có nguy cơ thêm câu trả lời "tôi cũng vậy", tôi đang đăng một phiên bản sửa đổi của tập lệnh đã gửi ở trên để cung cấp cho bạn một chế độ xem liệt kê tất cả các URL trong dự án, phần nào được kiểm chứng và sắp xếp theo thứ tự bảng chữ cái và các chế độ xem mà chúng gọi. Nhiều công cụ dành cho nhà phát triển hơn là một trang sản xuất.

def all_urls_view(request):
    from your_site.urls import urlpatterns #this import should be inside the function to avoid an import loop
    nice_urls = get_urls(urlpatterns) #build the list of urls recursively and then sort it alphabetically
    return render(request, "yourapp/links.html", {"links":nice_urls})

def get_urls(raw_urls, nice_urls=[], urlbase=''):
    '''Recursively builds a list of all the urls in the current project and the name of their associated view'''
    from operator import itemgetter
    for entry in raw_urls:
        fullurl = (urlbase + entry.regex.pattern).replace('^','')
        if entry.callback: #if it points to a view
            viewname = entry.callback.func_name
            nice_urls.append({"pattern": fullurl, 
                  "location": viewname})
        else: #if it points to another urlconf, recur!
            get_urls(entry.url_patterns, nice_urls, fullurl)
    nice_urls = sorted(nice_urls, key=itemgetter('pattern')) #sort alphabetically
    return nice_urls

và mẫu:

<ul>
{% for link in links %}
<li>
{{link.pattern}}   -----   {{link.location}}
</li>
{% endfor%}
</ul>

Nếu bạn muốn thực sự ưa thích, bạn có thể hiển thị danh sách với các hộp đầu vào cho bất kỳ regex nào đưa các biến để chuyển đến chế độ xem (lại là công cụ dành cho nhà phát triển chứ không phải là trang sản xuất).


4

Câu hỏi này hơi cũ, nhưng tôi đã gặp phải vấn đề tương tự và tôi nghĩ tôi sẽ thảo luận về giải pháp của mình. Một dự án Django nhất định rõ ràng cần một phương tiện để biết về tất cả các URL của nó và cần có thể thực hiện một số điều:

  1. bản đồ từ url -> xem
  2. ánh xạ từ một url được đặt tên -> url (sau đó 1 được sử dụng để xem)
  3. ánh xạ từ tên chế độ xem -> url (sau đó 1 được sử dụng để có được chế độ xem)

Django thực hiện điều này chủ yếu thông qua một đối tượng được gọi là a RegexURLResolver.

  1. RegexURLResolver.resolve (bản đồ từ url -> chế độ xem)
  2. RegexURLResolver.reverse

Bạn có thể chạm tay vào một trong những đồ vật này theo cách sau:

from my_proj import urls
from django.core.urlresolvers import get_resolver
resolver = get_resolver(urls)

Sau đó, bạn chỉ cần in ra các url của mình theo cách sau:

for view, regexes in resolver.reverse_dict.iteritems():
    print "%s: %s" % (view, regexes)

Điều đó nói rằng, giải pháp của Alasdair là hoàn toàn tốt và có một số ưu điểm, vì nó in ra một số điểm độc đáo hơn phương pháp này. Nhưng biết về và chạm tay vào một RegexURLResolverđối tượng là một điều thú vị cần biết, đặc biệt nếu bạn quan tâm đến nội bộ Django.


2

Tôi đã gửi một gói (django-showurls) thêm chức năng này vào bất kỳ dự án Django nào, đó là một lệnh quản lý mới đơn giản tích hợp tốt với management.py:

$ python manage.py showurls
^admin/
  ^$
    ^login/$
    ^logout/$
.. etc ..

Bạn có thể cài đặt nó thông qua pip:

pip install django-showurls

Và sau đó thêm nó vào các ứng dụng đã cài đặt của bạn trong tệp cài đặt dự án Django của bạn:

INSTALLED_APPS = [
    ..
    'django_showurls',
    ..
]

Và bạn đã sẵn sàng để đi.

Thông tin thêm tại đây - https://github.com/Niklas9/django-showurls


Rất vui, cảm ơn bạn. Nó có thể hữu ích nếu bên cạnh mỗi dòng cây, có tên của ứng dụng xác định quy tắc (hoặc một số cách tương tự để phát hiện ứng dụng).
Vedran Šego

Lưu ý rằng Django Extensions cũng bao gồm một show_urlslệnh - django-extensions.readthedocs.io/en/latest/...
Taylor Edmiston

1

Cách dễ nhất để có được danh sách đầy đủ các URL đã đăng ký là cài đặt Contrib.admindocs, sau đó kiểm tra phần "Lượt xem". Rất dễ thiết lập và cũng cung cấp cho bạn các tài liệu hoàn toàn có thể duyệt trên tất cả các thẻ mẫu, mô hình, v.v.


0

Bạn đang tìm kiếm các url được đánh giá hoặc không được đánh giá như được hiển thị trong chế độ GỬI? Để được đánh giá, django.contrib.sitemaps có thể giúp bạn ở đó, nếu không nó có thể liên quan đến một số kỹ thuật đảo ngược với mã của Django.


0

Khi tôi thử các câu trả lời khác ở đây, tôi gặp lỗi này:

django.core.exceptions.AppRegistryNotReady: Ứng dụng chưa được tải.

Có vẻ như vấn đề đến từ việc sử dụng django.contrib.admin.autodiscover()trong của tôi urls.py, vì vậy tôi có thể nhận xét điều đó hoặc tải Django đúng cách trước khi kết xuất URL. Tất nhiên nếu tôi muốn xem URL của quản trị viên trong ánh xạ, tôi không thể bình luận chúng.

Cách tôi tìm thấy là tạo một lệnh quản lý tùy chỉnh để kết xuất các url.

# install this file in mysite/myapp/management/commands/urldump.py
from django.core.management.base import BaseCommand

from kive import urls


class Command(BaseCommand):
    help = "Dumps all URL's."

    def handle(self, *args, **options):
        self.show_urls(urls.urlpatterns)

    def show_urls(self, urllist, depth=0):
        for entry in urllist:
            print ' '.join(("  " * depth, entry.regex.pattern,
                            entry.callback and entry.callback.__module__ or '',
                            entry.callback and entry.callback.func_name or ''))
            if hasattr(entry, 'url_patterns'):
                self.show_urls(entry.url_patterns, depth + 1)

-3

Nếu bạn đang chạy Django ở chế độ gỡ lỗi (có DEBUG = Truetrong cài đặt của bạn) và sau đó nhập một URL không tồn tại, bạn sẽ nhận được một trang lỗi liệt kê cấu hình URL hoàn chỉnh.


Như tôi đã đề cập, trang lỗi này không hiển thị cấu hình hoàn chỉnh vì nó không bao gồm thông tin về các cấu hình url được bao gồm .
Michael

Tôi hiểu chính xác ý của bạn về cấu hình url BAO GỒM, nhưng đã trả lời từ bộ nhớ bị lỗi vì tôi không có quyền truy cập ngay vào trang web thử nghiệm. Tôi thề rằng tôi đã thấy trang lỗi URL đặt khoảng trắng giữa url cấp cao nhất và các url được bao gồm nhưng bây giờ thì không thấy. Vì vậy, câu trả lời là KHÔNG, không có cách nào để xem cấu hình hoàn chỉnh.
Van Gale

Trang lỗi chỉ hiển thị các cấu hình url có liên quan . EG trang 404 /news/bad_url/sẽ hiển thị các url được bao gồm từ newsứng dụng, nhưng không hiển thị từ sportứng dụng.
Alasdair
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.