Django UrlConf Performance: Aiuto o feriti i gruppi di modelli nidificati?
-
12-11-2019 - |
Domanda
Mi chiedo se la ristrutturazione degli URLConfs delle mie app con diversi gruppi di modelli nidificati fornirà una spinta di prestazioni per quando Django cerca un modello di corrispondenza della richiesta.Non sono sicuro di come testare le prestazioni, ma l'ho provato e la nuova versione funziona almeno.
So che se c'è un aumento delle prestazioni, potrebbe anche essere trascurabile.Ho iniziato a farlo solo per vedere se i modelli sarebbero più facili da guardare come un albero;Sono più preoccupato per avvitare le cose rispetto alla velocità di aumento della velocità.
Di seguito è riportato l'URLConf di un'app che è inclusa dal master urlconf su /appname/
.
Old 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/'}),
)
.
NUOVO 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/'}),
)
.
Potrei andare ancora oltre (4 delle 5 variabili controllate con Regex sono definite almeno due volte), ma mi preoccupo di perdere il vantaggio originale della leggibilità.
Soluzione
Se tu non si desidera raccoglierti e seguire il principio di asciutto, che a volte è incorporato molto quando si sviluppa il codice Django, dovresti raggruppare i tuoi URL.Quindi ridurrai il codice duplicato della quantità e il codice di produzione che è molto più facile da mantenere.Pensa ad esempio sul fatto che in seguito si può cambiare il rapporto / URL a qualcos'altro, dovresti farlo per ogni singolo URL allora!