Pertanyaan Tentukan konfigurasi url lengkap Django


Apakah ada cara untuk mendapatkan lengkap konfigurasi url django?

Sebagai contoh, halaman 404 debugging Django tidak menunjukkan konfigurasi url yang disertakan, jadi ini bukan konfigurasi lengkap.


Menjawab: Terima kasih kepada Alasdair, berikut ini contoh skripnya:

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)

75
2017-12-01 19:05


asal


Jawaban:


Django adalah Python, jadi introspeksi adalah temanmu.

Di shell, impor urls. Dengan memutar balik urls.urlpatterns, dan mengebor sebanyak mungkin lapisan konfigurasi url yang disertakan, Anda dapat membangun konfigurasi url lengkap.

import urls
urls.urlpatterns

Daftar urls.urlpatterns mengandung RegexURLPattern dan RegexURLResolver objek.

Untuk sebuah RegexURLPattern obyek p Anda dapat menampilkan ekspresi reguler dengan

p.regex.pattern

Untuk sebuah RegexURLResolver obyek q, yang mewakili konfigurasi url yang disertakan, Anda dapat menampilkan bagian pertama dari ekspresi reguler dengan

q.regex.pattern

Kemudian gunakan

q.url_patterns

yang akan mengembalikan daftar lebih lanjut RegexURLResolver dan RegexURLPattern objek.


45
2017-12-01 23:02



Ekstensi Django menyediakan utilitas untuk melakukan ini sebagai perintah manage.py.

pip install django-extensions

Kemudian tambahkan django_extensions ke INSTALLED_APPS Anda di settings.py. lalu dari konsol cukup ketikkan yang berikut

python manage.py show_urls

60
2017-11-08 21:38



Dengan risiko menambahkan jawaban "saya juga", saya memposting versi modifikasi dari skrip yang dikirimkan di atas yang memberi Anda tampilan daftar semua URL dalam proyek, yang sudah ditentukan dan diurutkan sesuai abjad, dan tampilan yang mereka sebut. Lebih dari alat pengembang dari halaman produksi.

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

dan templatnya:

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

Jika Anda ingin benar-benar mewah, Anda bisa membuat daftar dengan kotak input untuk setiap regexes yang mengambil variabel agar lolos ke tampilan (lagi sebagai alat pengembang daripada halaman produksi).


6
2017-07-01 21:41



Pertanyaan ini agak lama, tetapi saya mengalami masalah yang sama dan saya pikir saya akan mendiskusikan solusi saya. Proyek Django yang diberikan jelas membutuhkan sarana untuk mengetahui tentang semua URL dan perlu dapat melakukan beberapa hal:

  1. peta dari tampilan url ->
  2. peta dari url bernama -> url (kemudian 1 digunakan untuk mendapatkan tampilan)
  3. peta dari nama tampilan -> url (kemudian 1 digunakan untuk mendapatkan tampilan)

Django menyelesaikan ini sebagian besar melalui objek yang disebut a RegexURLResolver.

  1. RegexURLResolver.resolve (peta dari tampilan url ->)
  2. RegexURLResolver.reverse

Anda bisa mendapatkan tangan Anda di salah satu objek ini dengan cara berikut:

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

Kemudian, Anda cukup mencetak url Anda dengan cara berikut:

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

Yang mengatakan, solusi Alasdair baik-baik saja dan memiliki beberapa keuntungan, karena mencetak beberapa yang lebih baik dari metode ini. Tetapi mengetahui tentang dan mendapatkan tangan Anda pada RegexURLResolver objek adalah sesuatu yang bagus untuk diketahui, terutama jika Anda tertarik pada internal Django.


4
2018-01-05 06:36



Saya telah mengirimkan paket (django-showurls) yang menambahkan fungsi ini ke setiap proyek Django, ini adalah perintah manajemen baru yang sederhana yang terintegrasi dengan baik dengan manage.py:

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

Anda dapat menginstalnya melalui pip:

pip install django-showurls

Dan kemudian menambahkannya ke aplikasi Anda yang sudah diinstal di file pengaturan proyek Django Anda:

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

Dan Anda siap untuk pergi.

Info lebih lanjut di sini - https://github.com/Niklas9/django-showurls


2
2018-02-20 09:36



Cara termudah untuk mendapatkan daftar lengkap URL terdaftar adalah menginstal contrib.admindocs kemudian periksa bagian "Tampilan". Sangat mudah untuk mengatur, dan juga memberi Anda dokumen yang dapat dijelajahi sepenuhnya di semua tag template, model, dll.


1
2017-07-23 18:13



Apakah Anda mencari url yang dievaluasi atau tidak dievaluasi seperti yang ditunjukkan dalam mode DEBUG? Untuk dievaluasi, django.contrib.sitemaps dapat membantu Anda di sana, jika tidak, ini mungkin melibatkan beberapa rekayasa balik dengan kode Django.


0
2017-12-01 22:22



Ketika saya mencoba jawaban lain di sini, saya mendapat kesalahan ini:

django.core.exceptions.AppRegistryNotReady: Aplikasi belum dimuat.

Sepertinya masalahnya berasal dari penggunaan django.contrib.admin.autodiscover() di dalam saya urls.py, jadi saya bisa mengomentari itu, atau memuat Django dengan benar sebelum membuang URL. Tentu saja jika saya ingin melihat URL admin dalam pemetaan, saya tidak dapat berkomentar.

Cara saya temukan adalah membuat perintah manajemen kustom yang membuang 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)

0
2018-05-04 17:29



Jika Anda menjalankan Django dalam mode debug (miliki DEBUG = True di pengaturan Anda) dan kemudian ketik URL tidak ada Anda akan mendapatkan halaman kesalahan daftar konfigurasi URL lengkap.


-3
2017-12-01 21:32