Tam Django url yapılandırmasını belirleyin


82

Tam django url yapılandırmasını almanın bir yolu var mı ?

Örneğin, Django'nun hata ayıklama 404 sayfası dahil edilen url yapılandırmalarını göstermez, bu nedenle bu tam yapılandırma değildir.


Cevap : Alasdair'e teşekkürler, işte örnek bir komut dosyası:

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
çok kullanışlı komut dosyası, teşekkürler
RichVel

Yanıtlar:


49

Django Python'dur, bu nedenle iç gözlem sizin dostunuzdur.

Kabukta içe aktarın urls. urls.urlpatternsDahil edilen url yapılandırmalarının olabildiğince çok katmanında döngü oluşturarak ve ayrıntılara inerek, eksiksiz url yapılandırmasını oluşturabilirsiniz.

import urls
urls.urlpatterns

Liste urls.urlpatternsiçerir RegexURLPatternve RegexURLResolvernesneleri.

Bir RegexURLPatternnesne piçin normal ifadeyi şu şekilde görüntüleyebilirsiniz:

p.regex.pattern

Dahil edilen bir url yapılandırmasını temsil eden bir RegexURLResolvernesne için q, normal ifadenin ilk bölümünü şu şekilde görüntüleyebilirsiniz:

q.regex.pattern

Sonra kullan

q.url_patterns

RegexURLResolverve RegexURLPatternnesnelerin başka bir listesini döndürür .


3
İyi bir fikir! Burada basit bir komut dosyası hazırladım
Michael

Bu zarif bir işlev. Ben yazma tek denediler ama onlar olsaydı nesne türleri görmek için kontrol katılan RegexURLPatternveya RegexURLResolver. Kullanmak has_attrçok daha iyi bir fikir. Fonksiyonunuzu burada Stack Overflow'da yanıtlamalısınız. Ben oylarım.
Alasdair

bu, ayarlar dosyası aracılığıyla çok sayıda döngüsel içe aktarma sorununa neden olur !!
NoobEditor

67

Django uzantıları, bunu bir manage.py komutu olarak yapmak için bir yardımcı program sağlar.

pip install django-extensions

Ardından django_extensionsINSTALLED_APPS hesabınıza ekleyin settings.py. sonra konsoldan şunu yazın:

python manage.py show_urls

2
Kullanışlı! Bunu asla keşfedeceğimi sanmıyorum. Teşekkürler!
Tim Ruddick

6

Bir "ben de" yanıtı ekleme riskiyle, yukarıda gönderilen komut dosyasının değiştirilmiş bir sürümünü gönderiyorum, bu size projedeki tüm URL'leri bir şekilde güzelleştirip alfabetik olarak sıralı bir görünüm ve bunların çağırdığı görünümleri listeleyen bir görünüm sağlar. Bir üretim sayfasından çok bir geliştirici aracı.

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

ve şablon:

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

Gerçek bir fantezi elde etmek istiyorsanız, görünüme geçmek için değişken alan normal ifadelerden herhangi biri için listeyi giriş kutuları ile oluşturabilirsiniz (yine üretim sayfası yerine bir geliştirici aracı olarak).


4

Bu soru biraz eski ama ben de aynı problemle karşılaştım ve çözümümü tartışacağımı düşündüm. Belli bir Django projesinin, tüm URL'leri hakkında bilgi sahibi olmak için bir araca ihtiyacı olduğu ve birkaç şeyi yapabilmesi gerektiği açıktır:

  1. url'den harita -> görüntüle
  2. adlandırılmış bir url'den harita -> url (daha sonra görünümü almak için 1 kullanılır)
  3. bir görünüm adından harita -> url (daha sonra görünümü almak için 1 kullanılır)

Django bunu çoğunlukla a adlı bir nesne aracılığıyla gerçekleştirir RegexURLResolver.

  1. RegexURLResolver.resolve (bir url'den harita -> görünüm)
  2. RegexURLResolver.reverse

Ellerinizi aşağıdaki şekilde bu nesnelerden birine tutabilirsiniz:

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

Ardından, URL'lerinizi aşağıdaki şekilde yazdırabilirsiniz:

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

Bununla birlikte, Alasdair'in çözümü gayet iyi ve bu yöntemden daha güzel bazı şeyleri yazdırdığı için bazı avantajları var. Ancak bir RegexURLResolvernesneyi bilmek ve elinize almak , özellikle Django'nun iç kısımlarıyla ilgileniyorsanız, bilmek güzel bir şeydir.


2

Bu işlevselliği herhangi bir Django projesine ekleyen bir paket (django-showurls) gönderdim, bu, manage.py ile iyi bir şekilde bütünleşen basit ve yeni bir yönetim komutudur:

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

Pip aracılığıyla kurabilirsiniz:

pip install django-showurls

Ve sonra bunu Django proje settings.py dosyanızda yüklü uygulamalarınıza ekleyin:

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

Ve gitmeye hazırsın.

Daha fazla bilgi burada - https://github.com/Niklas9/django-showurls


Güzel, teşekkür ederim. Her ağaç satırının yanında, kuralı tanımlayan uygulamanın adı (veya uygulamayı algılamak için benzer bir yol) olması yararlı olabilir.
Vedran Šego

Django Uzantıları ayrıca içerdiğini Not show_urls- komutu django-extensions.readthedocs.io/en/latest/...
Taylor Edmiston

1

Kayıtlı URL'lerin tam listesini almanın en kolay yolu, Contrib.admindocs'u yüklemek ve ardından "Görünümler" bölümünü kontrol etmektir. Kurulumu çok kolaydır ve ayrıca tüm şablon etiketleriniz, modelleriniz vb. İçin size tamamen göz atılabilir belgeler sunar.


0

DEBUG modunda gösterildiği gibi değerlendirilmiş veya değerlendirilmemiş url'leri mi arıyorsunuz? Django.contrib.sitemaps değerlendirildiğinde size yardımcı olabilir, aksi takdirde Django'nun koduyla bir miktar ters mühendislik içerebilir.


0

Buradaki diğer cevapları denediğimde şu hatayı aldım:

django.core.exceptions.AppRegistryNotReady: Uygulamalar henüz yüklenmedi.

Görünüşe göre sorun django.contrib.admin.autodiscover()benim içinde kullanmaktan kaynaklanıyor urls.py, bu yüzden bunu yorumlayabilirim veya URL'leri dökmeden önce Django'yu düzgün bir şekilde yükleyebilirim. Elbette, eşlemede yönetici URL'lerini görmek istersem, onları yorumlayamam.

Bulduğum yol , url'leri döken özel bir yönetim komutu oluşturmaktı .

# 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'yu hata ayıklama modunda çalıştırıyorsanız ( DEBUG = Trueayarlarınızda var) ve ardından var olmayan bir URL yazarsanız, tam URL yapılandırmasını listeleyen bir hata sayfası alırsınız.


Bahsettiğim gibi, bu hata sayfası tam yapılandırmayı göstermiyor çünkü dahil edilen url yapılandırmaları hakkında bilgi içermiyor .
Michael

DAHİL URL yapılandırmaları hakkında ne demek istediğinizi tam olarak anladım, ancak bir test sitesine hemen erişemediğim için hatalı bellekten yanıt verdim. Yemin ederim URL hata sayfasının üst düzey url ile dahil edilen url'ler arasına bir boşluk koyduğunu görüyorum ama şimdi görmüyorum. Yani cevap HAYIR, tam konfigürasyonu görmenin bir yolu yok.
Van Gale

Hata sayfası yalnızca ilgili dahil edilen url yapılandırmalarını gösterir. Örneğin, 404 sayfası uygulamadan /news/bad_url/dahil edilen url'leri gösterecektir news, ancak sportuygulamadan göstermeyecektir.
Alasdair
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.