완전한 Django URL 구성 결정


82

완전한 장고 URL 구성 을 얻는 방법이 있습니까?

예를 들어 Django의 디버깅 404 페이지에는 포함 된 URL 구성이 표시되지 않으므로 이것은 완전한 구성이 아닙니다.


답변 : Alasdair 덕분에 다음은 예제 스크립트입니다.

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
매우 유용한 스크립트, 감사
RichVel

답변:


49

Django는 Python이므로 내성은 당신의 친구입니다.

셸에서 urls. 을 반복 urls.urlpatterns하고 포함 된 URL 구성의 가능한 한 많은 레이어를 드릴 다운하여 완전한 URL 구성을 구축 할 수 있습니다.

import urls
urls.urlpatterns

목록 urls.urlpatterns에는 RegexURLPatternRegexURLResolver개체 가 포함 됩니다.

A의 RegexURLPattern객체 p당신과 함께 정규 표현식을 표시 할 수 있습니다

p.regex.pattern

A의 RegexURLResolver객체 q는 포함 된 URL 구성을 나타냅니다, 당신은 정규 표현식과의 첫 부분을 표시 할 수 있습니다

q.regex.pattern

그런 다음

q.url_patterns

추가 RegexURLResolverRegexURLPattern객체 목록을 반환 합니다.


3
좋은 생각! 여기에 간단한 스크립트를 만들었습니다. code.activestate.com/recipes/576974
Michael

그것은 우아한 기능입니다. 나는 하나를 작성하려고 시도했지만 객체 유형이 RegexURLPattern또는 인지 확인하는 작업이 포함되었습니다 RegexURLResolver. 사용하는 has_attr것이 훨씬 더 좋은 생각입니다. 여기에 Stack Overflow에 함수를 넣어야합니다. 나는 그것을 찬성 할 것입니다.
Alasdair

이로 인해 설정 파일을 통해 많은 주기적 가져 오기 문제가 발생합니다 !!
NoobEditor

67

Django 확장은 manage.py 명령으로이를 수행하는 유틸리티를 제공합니다.

pip install django-extensions

그런 다음 django_extensionsINSTALLED_APPS에 settings.py. 그런 다음 콘솔에서 다음을 입력하십시오.

python manage.py show_urls

2
능숙한! 나는 이것을 발견하지 못했을 것이라고 생각합니다. 감사!
Tim Ruddick 2014 년

6

"me too"답변을 추가 할 위험을 감수하면서 프로젝트의 모든 URL을 다소 예쁘고 알파벳순으로 정렬 한보기와 ​​그들이 호출하는보기를 제공하는 위에서 제출 한 스크립트의 수정 된 버전을 게시하고 있습니다. 프로덕션 페이지보다 개발자 도구에 가깝습니다.

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

및 템플릿 :

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

정말 멋지게 만들고 싶다면 변수를 뷰로 전달하는 정규식에 대한 입력 상자가있는 목록을 렌더링 할 수 있습니다 (다시 프로덕션 페이지가 아닌 개발자 도구로).


4

이 질문은 조금 오래되었지만 동일한 문제가 발생하여 해결책에 대해 논의 할 것이라고 생각했습니다. 주어진 Django 프로젝트는 분명히 모든 URL에 대해 알 수있는 수단이 필요하며 몇 가지 작업을 수행 할 수 있어야합니다.

  1. URL에서지도->보기
  2. 명명 된 url-> url의지도 (1은보기를 가져 오는 데 사용됨)
  3. 보기 이름-> url에서지도 (보기를 가져 오는 데 1이 사용됨)

Django는 주로 RegexURLResolver.

  1. RegexURLResolver.resolve (URL에서 매핑->보기)
  2. RegexURLResolver.reverse

다음과 같은 방법으로 이러한 개체 중 하나를 손에 넣을 수 있습니다.

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

그런 다음 다음과 같은 방법으로 URL을 간단히 인쇄 할 수 있습니다.

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

즉, Alasdair의 솔루션은이 방법보다 더 멋지게 인쇄하기 때문에 완벽하고 몇 가지 장점이 있습니다. 그러나 RegexURLResolver객체 에 대해 알고 손을 뻗는 것은 특히 Django 내부에 관심이 있다면 알아두면 좋은 것입니다.


2

이 기능을 모든 Django 프로젝트에 추가하는 패키지 (django-showurls)를 제출했습니다. 이는 manage.py와 잘 통합되는 간단한 새 관리 명령입니다.

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

pip를 통해 설치할 수 있습니다.

pip install django-showurls

그런 다음 Django 프로젝트 settings.py 파일에서 설치된 앱에 추가합니다.

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

그리고 당신은 갈 준비가되었습니다.

여기에 더 많은 정보-https: //github.com/Niklas9/django-showurls


좋아, 고마워. 각 트리 라인 옆에 규칙을 정의하는 앱 이름 (또는 앱을 감지하는 유사한 방법)이있는 경우 유용 할 수 있습니다.
Vedran Šego

장고 확장도 포함 주 show_urls- 명령 django-extensions.readthedocs.io/en/latest/...
테일러 Edmiston

1

등록 된 URL의 전체 목록을 얻는 가장 쉬운 방법은 contrib.admindocs 를 설치 한 다음 "보기"섹션을 확인하는 것입니다. 설정이 매우 쉬우 며 모든 템플릿 태그, 모델 등에 대해 완전히 찾아 볼 수있는 문서를 제공합니다.


0

DEBUG 모드에 표시된대로 평가되거나 평가되지 않은 URL을 찾고 있습니까? 평가를 위해 django.contrib.sitemaps가 도움이 될 수 있습니다. 그렇지 않으면 Django의 코드로 리버스 엔지니어링이 포함될 수 있습니다.


0

여기에서 다른 답변을 시도했을 때이 오류가 발생했습니다.

django.core.exceptions.AppRegistryNotReady : 앱이 아직로드되지 않았습니다.

문제는 django.contrib.admin.autodiscover()내 에서 사용하는 것 같아서 urls.py주석을 달거나 URL을 덤프하기 전에 Django를 올바르게로드 할 수 있습니다. 물론 매핑에서 관리 URL을보고 싶다면 주석 처리 할 수 ​​없습니다.

내가 찾은 방법 은 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

Django를 디버그 모드 ( DEBUG = True설정에 있음)로 실행 한 다음 존재하지 않는 URL을 입력하면 전체 URL 구성을 나열하는 오류 페이지가 표시됩니다.


앞서 언급했듯이이 오류 페이지에는 포함 된 URL 구성 에 대한 정보가 포함되어 있지 않기 때문에 전체 구성이 표시되지 않습니다 .
Michael

INCLUDED url 구성에 대해 정확히 이해했지만 테스트 사이트에 즉시 액세스 할 수 없었기 때문에 잘못된 메모리에서 답변했습니다. URL 오류 페이지가 최상위 URL과 포함 된 URL 사이에 공백을 두는 것을 보았지만 지금은 그렇지 않습니다. 따라서 대답은 아니요입니다. 전체 구성을 볼 수있는 방법이 없습니다.
Van Gale

오류 페이지에는 관련된 포함 된 URL 구성 만 표시됩니다 . 예를 들어에 대한 404 페이지 /news/bad_url/news앱에서가 아닌 앱 에서 포함 된 URL을 표시 sport합니다.
Alasdair
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.