È meglio usare path () o url () in urls.py per django 2.0?


131

In un corso online di django, l'istruttore ci fa usare la url()funzione per chiamare le viste e utilizzare le espressioni regolari nell'elenco degli URL. Ho visto altri esempi su YouTube di questo. per esempio

from django.contrib import admin
from django.urls import include
from django.conf.urls import url

urlpatterns = [
    path('admin/', admin.site.urls),
    url(r'^polls/', include('polls.urls')),
]


#and in polls/urls.py

urlpatterns = [        
    url(r'^$', views.index, name="index"),
]

Tuttavia, durante l'esercitazione di Django, usano path()invece ad esempio:

from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name="index"),        
]

Inoltre, le espressioni regolari non sembrano funzionare con la path()funzione poiché l'uso di a path(r'^$', views.index, name="index")non trova la mysite.com/polls/vista.

L'uso path()senza regex corrisponde al modo corretto di andare avanti? È url()più potente ma più complicato, quindi lo usano path()per iniziare? O è un caso di strumenti diversi per diversi lavori?


2
Se stai seguendo un tutorial, userei qualunque stile il tutorial usi, per evitare errori quando si passa da path()e a url(). Se vuoi o hai bisogno di usare regex, allora devi usare re_path()o url(). Oltre a ciò, penso che dipenda da te quale scegli.
Alasdair,

Risposte:


174

Dalla documentazione di Django per url

url(regex, view, kwargs=None, name=None)Questa funzione è un alias di django.urls.re_path(). È probabile che sia deprecato in una versione futura.

La differenza chiave tra pathe re_pathè che pathusa route senza regex

È possibile utilizzare re_pathper chiamate regex complesse e utilizzare solo pathper ricerche più semplici


1
Grazie per le informazioni dettagliate! re_pathè quello che sto cercando allora.
FrostedCookies il

65

La nuova django.urls.path()funzione consente una sintassi di routing URL più semplice e più leggibile. Ad esempio, questo esempio delle precedenti versioni di Django:

url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive)

potrebbe essere scritto come:

path('articles/<int:year>/', views.year_archive)

La django.conf.urls.url() funzione delle versioni precedenti è ora disponibile come django.urls.re_path(). La vecchia posizione rimane per compatibilità con le versioni precedenti, senza un imminente deprezzamento. La vecchia django.conf.urls.include()funzione è ora impossibile da django.urlscosì puoi usare:

from django.urls import include, path, re_path

negli URLconfs . Per ulteriori letture django doc


10
Un po 'fuorviante poiché il tuo path()esempio consente numeri non a quattro cifre.
BrainCore,

I /<int:year>/significa che l'anno dovrebbe essere in numero intero, vi consiglio di guardare attraverso la documentazione ufficiale.
Sylvernus Akubo,

2
@silvablaze Come affermato da BrainCore, intnon è equivalente a [0-9]{4}. Il fatto che sia usato per numeri interi o no non ha alcuna influenza su questa relazione. Forse se hai sostituito [0-9]{4}con il [0-9]+tuo confronto potrebbe essere meno impreciso, anche se potresti aver ancora bisogno di affrontare il tipo di risultato finale (str vs int?).
Jan Kyu Peblik,

Questa è la risposta netta sull'argomento. Grazie.
VikasBhat il

19

pathè semplicemente nuovo in Django 2.0, che è stato rilasciato solo un paio di settimane fa. La maggior parte dei tutorial non saranno stati aggiornati per la nuova sintassi.

Doveva certamente essere un modo più semplice di fare le cose; Non direi però che l'URL è più potente, dovresti essere in grado di esprimere schemi in entrambi i formati.


9

Le espressioni regolari non sembra funzionare con la path()funzione con i seguenti argomenti: path(r'^$', views.index, name="index").

Dovrebbe essere simile a questo: path('', views.index, name="index").

Il primo argomento deve essere vuoto per inserire un'espressione regolare.


2
Sì, penso come indicato sopra per usare REs devi invece usare la funzione re_path ().
FrostedCookies


2

Dalla v2.0 molti utenti usano path, ma possiamo usare path o url. Ad esempio in django 2.1.1 il mapping alle funzioni tramite url può essere eseguito come segue

from django.contrib import admin
from django.urls import path

from django.contrib.auth import login
from posts.views import post_home
from django.conf.urls import url

urlpatterns = [
    path('admin/', admin.site.urls),
    url(r'^posts/$', post_home, name='post_home'),

]

dove posts è un'applicazione e post_home è una funzione in views.py

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.