Leistung von Django urlconf:Werden verschachtelte Mustergruppen helfen oder schaden?
-
12-11-2019 - |
Frage
Ich frage mich, ob die Umstrukturierung der URLconfs meiner Apps mit mehreren verschachtelten Mustergruppen zu einer Leistungssteigerung führt, wenn Django nach einem Muster für den Anforderungsabgleich sucht.Ich bin mir nicht sicher, wie ich die Leistung testen soll, aber ich habe es ausprobiert und die neue Version funktioniert zumindest.
Ich weiß, dass eine Leistungssteigerung genauso gut vernachlässigbar sein kann.Ich habe damit nur begonnen, um zu sehen, ob die Muster als Baum leichter zu betrachten sind.Mir geht es mehr darum, Dinge zu vermasseln, als darum, die Geschwindigkeit zu steigern.
Das Folgende ist die URL-Konferenz einer App, die in der Master-URL-Konferenz unter enthalten ist /appname/
.
Alte URLconf:
from django.contrib.auth.decorators import login_required
from django.conf.urls.defaults import patterns, include, url
from django.views.generic.simple import redirect_to
from appname import views
urlpatterns = patterns('',
# Actions on sets of reports
url(r'^reports/page(?P<page>[0-9]+)/$', login_required(views.appnameListView.as_view())),
url(r'^reports/bill/', views.bill),
# Actions on individual reports
url(r'^report/new/', views.new),
url(r'^report/(?P<reportNumber>[^/]+)/$', views.detail),
url(r'^report/(?P<reportNumber>[^/]+)/delete/$', views.delete),
url(r'^report/(?P<reportNumber>[^/]+)/edit/$', views.edit),
url(r'^report/(?P<reportNumber>[^/]+)/print/$', views.detail_print),
# url(r'^report/(?P<reportNumber>[^/]+)/pdf/$', views.detail_pdf),
# Configure app settings
url(r'^config/$', views.configure),
url(r'^config/reporttype/(?P<id>[^/]+)/$', views.configure_ReportType),
url(r'^config/reporttype/(?P<id>[^/]+)/delete/$', views.configure_ReportType_delete),
url(r'^config/avgmethod/(?P<name>[^/]+)/$', views.configure_AvgMethod),
url(r'^config/avgmethod/(?P<name>[^/]+)/delete/$', views.configure_AvgMethod_delete),
url(r'^config/datatransformer/(?P<name>[^/]+)/$', views.configure_DataTransformer),
url(r'^config/datatransformer/(?P<name>[^/]+)/delete/$', views.configure_DataTransformer_delete),
# Catch all; #TODO: 404
url(r'^', redirect_to, {'url': '/appname/reports/page1/'}),
)
Neue URLconf:
from django.contrib.auth.decorators import login_required
from django.conf.urls.defaults import patterns, include, url
from django.views.generic.simple import redirect_to
from appname import views
urlpatterns = patterns('',
# Actions on sets of reports
url(r'^reports/', include(patterns('',
url(r'^page(?P<page>[0-9]+)/$', login_required(views.appnameListView.as_view())),
url(r'^bill/', views.bill),
))),
# Actions on individual reports
url(r'^report/', include(patterns('',
url(r'^new/', views.new),
url(r'^(?P<reportNumber>[^/]+)/$', views.detail),
url(r'^(?P<reportNumber>[^/]+)/delete/$', views.delete),
url(r'^(?P<reportNumber>[^/]+)/edit/$', views.edit),
url(r'^(?P<reportNumber>[^/]+)/print/$', views.detail_print),
# url(r'^(?P<reportNumber>[^/]+)/pdf/$', views.detail_pdf),
))),
# Configure app settings
url(r'^config/', include(patterns('',
url(r'^$', views.configure),
url(r'^reporttype/(?P<id>[^/]+)/$', views.configure_ReportType),
url(r'^reporttype/(?P<id>[^/]+)/delete/$', views.configure_ReportType_delete),
url(r'^avgmethod/(?P<name>[^/]+)/$', views.configure_AvgMethod),
url(r'^avgmethod/(?P<name>[^/]+)/delete/$', views.configure_AvgMethod_delete),
url(r'^datatransformer/(?P<name>[^/]+)/$', views.configure_DataTransformer),
url(r'^datatransformer/(?P<name>[^/]+)/delete/$', views.configure_DataTransformer_delete),
))),
# Catch all; #TODO: 404
url(r'^', redirect_to, {'url': '/appname/reports/page1/'}),
)
Ich könnte sogar noch weiter gehen (4 der 5 mit Regex überprüften Variablen sind mindestens zweimal definiert), aber ich mache mir Sorgen, dass der ursprüngliche Vorteil der Lesbarkeit verloren geht.
Lösung
Wenn du Ich möchte mich nicht wiederholen und dem DRY-Prinzip folgen, das manchmal häufig bei der Entwicklung von Django-Code verwendet wird, sollten Sie Ihre URLs gruppieren.So reduzieren Sie die Menge an doppeltem Code und erstellen Code, der viel einfacher zu warten ist.Denken Sie zum Beispiel daran, dass Sie später möglicherweise den Bericht/die URLs in etwas anderes ändern möchten, dann müssten Sie dies für jede einzelne URL tun!