2009-12-01 4 views
71

django URL 구성을 완료하는 방법이 있습니까?완전한 장고 URL 구성을 결정하십시오.

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


대답 :

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

답변

44

장고는 파이썬이므로 내성 검사는 당신의 친구입니다.

셸에서 urls을 가져옵니다. urls.urlpatterns을 반복하면서 포함 된 URL 구성을 최대한 많이 드릴 다운하면 완전한 URL 구성을 구축 할 수 있습니다.

import urls 
urls.urlpatterns 

목록 urls.urlpatternsRegexURLPatternRegexURLResolver 개체를 포함합니다. 만약 포함 된 URL의 구성을 나타내는 RegexURLResolver 객체 q 대해서는

p.regex.pattern 

과 정규 표현식을 표시 할 수 pRegexURLPattern 객체 용

하면

과 정규 표현식 중 첫 번째 부분을 표시 할
q.regex.pattern 

그러면 RegexURLResolverRegexURLPattern 개체 목록이 반환됩니다.

+3

좋은 아이디어! 여기 간단한 스크립트를 만들었습니다 : http://code.activestate.com/recipes/576974/ – Michael

+0

그건 훌륭한 기능입니다. 나는 하나 쓰기를 시도하기 시작했으나 객체 유형을 검사하여 그들이'RegexURLPattern' 또는'RegexURLResolver'인지 확인했다. 'has_attr'을 사용하는 것이 훨씬 더 좋은 생각입니다. 스택 오버플로 (Stack Overflow)에 대한 대답을 여기에 입력해야합니다. 나는 그것을 upvote 줄. – Alasdair

+0

이렇게하면 설정 파일을 통해 순환 가져 오기 문제가 너무 많이 발생합니다 !! – NoobEditor

-3

디버그 모드에서 장고를 실행하는 경우 (설정에서 DEBUG = True를) 다음 존재를 입력 : Alasdair 덕분에, 여기 예제 스크립트입니다 URL을 입력하면 전체 URL 구성을 나열하는 오류 페이지가 표시됩니다.

+0

,이 오류 페이지는 전체 구성을 표시하지 않습니다. – Michael

+0

내가 포함 된 url 구성에 대한 의미를 정확히 이해했지만 테스트 사이트에 대한 즉각적인 액세스 권한이 없기 때문에 오류가있는 메모리에서 응답했습니다. URL 오류 페이지가 최상위 수준 URL과 포함 된 URL 사이에 공백을 넣지 만 지금은 그렇지 않은지 확인했습니다. 따라서 대답은 '아니오'입니다. 완전한 구성을 볼 방법이 없습니다. –

+0

오류 페이지에는 _relevant_ 포함 된 URL 구성 만 표시됩니다. E.G. '/ news/bad_url /'에 대한 404 페이지는'news' 앱의 포함 된 URL은 표시하지만'sport' 앱의 URL은 표시하지 않습니다. – Alasdair

0

DEBUG 모드에서와 같이 평가되거나 평가되지 않은 URL을 찾고 있습니까? 평가를 위해 django.contrib.sitemaps가 당신을 도울 수 있습니다. 그렇지 않으면 장고의 코드로 리버스 엔지니어링이 될 수 있습니다.

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> 

개발자 페이지).

1

등록 된 URL의 전체 목록을 가져 오는 가장 쉬운 방법은 contrib.admindocs을 설치 한 다음 '보기'섹션을 확인하는 것입니다.설정이 매우 쉽고 템플릿 태그, 모델 등 모든 템플릿 태그를 완벽하게 탐색 할 수있는 문서를 제공합니다.

57

장고 확장 프로그램은 manage.py 명령으로이를 수행 할 수있는 유틸리티를 제공합니다.

pip install django-extensions 

그런 settings.py에 INSTALLED_APPS에 django_extensions를 추가합니다. 콘솔에서 다음을 입력하십시오.

+1

핸디! 나는 내가 이것을 발견했을 것이라고 생각하지 않는다. 감사! –

+0

굉장! 감사! – mawaldne

+0

이것은 올바른 대답입니다 – abbood

4

이 질문은 약간 오래된 것이지만 나는 내 해결책을 논의 할 것이라고 생각했습니다. 주어진 장고 프로젝트는 분명히 모든 URL에 대해 알 수있는 방법을 필요로하고 몇 가지 할 수 있어야합니다 : - 명명 된 URL에서보기>

  • 지도 - URL에서

    1. 지도> URL (다음 1 뷰) 뷰 이름에서
    2. 지도를 가져 오는 데 사용됩니다 -> URL (다음 1 장고 객체가 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.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.

    문제가 내 urls.pydjango.contrib.admin.autodiscover()를 사용에서 오는 것 같습니다, 그래서 그 주석, 또는 제대로하기 전에 장고를로드 할 수 있습니다 : 여기 다른 답변을했을 때, 나는이 오류가 발생했습니다

  • 0

    URL을 덤프합니다. 물론 매핑에서 관리 URL을보고 싶다면 주석을 달 수는 없습니다.

    내가 찾은 방법은 custom management command을 작성하여 URL을 덤프하는 것입니다.

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

    당신은 설치할 수있는 장고 프로젝트에이 기능을 추가

    # 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) 
    
    2

    I 패키지 (장고 - showurls)를 제출, 그것은 manage.py과 잘 통합 간단한 새로운 관리 명령이다 그것을 통해서 :

    pip install django-showurls 
    

    그리고 나서 Django 프로젝트 설정에서 설치된 응용 프로그램에 추가하십시오.파일 :

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

    이제 준비가 완료되었습니다. 여기

    상세 정보 - 내가 언급 한 바와 같이이 * 포함 * URL 구성에 대한 정보를 포함하지 않기 때문에 https://github.com/Niklas9/django-showurls

    +0

    니스, 고마워요. 각 트리 라인 옆에 규칙을 정의하는 앱의 이름 (또는 앱을 감지 할 수있는 유사한 방법)이 있다면 유용 할 수 있습니다. –

    +0

    Django Extensions에는'show_urls' 명령도 포함되어 있습니다 - http://django-extensions.readthedocs.io/en/latest/command_extensions.html –