[python] 완전한 Django URL 구성 결정

완전한 장고 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)



답변

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객체 목록을 반환 합니다.


답변

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

pip install django-extensions

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

python manage.py show_urls


답변

“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>

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


답변

이 질문은 조금 오래되었지만 동일한 문제가 발생하여 해결책에 대해 논의 할 것이라고 생각했습니다. 주어진 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 내부에 관심이 있다면 알아두면 좋은 것입니다.


답변

이 기능을 모든 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


답변

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


답변

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