Ist es besser, path () oder url () in urls.py für django 2.0 zu verwenden?

131

In einem Django-Online-Kurs lässt uns der Kursleiter die url()Funktion verwenden, um Ansichten aufzurufen und reguläre Ausdrücke in der URL-Musterliste zu verwenden. Ich habe auf youtube andere Beispiele dafür gesehen. z.B

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"),
]

Beim Durchlaufen des Django-Tutorials verwenden sie jedoch path()stattdessen z.

from django.urls import path
from . import views

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

Außerdem scheinen reguläre Ausdrücke mit der path()Funktion nicht zu funktionieren, da die Verwendung von a path(r'^$', views.index, name="index")die mysite.com/polls/Ansicht nicht findet .

Stimmt die Verwendung path()ohne Regex mit der richtigen Vorgehensweise überein? Ist url()es mächtiger, aber komplizierter, damit sie uns path()anfangen? Oder handelt es sich um unterschiedliche Werkzeuge für unterschiedliche Aufgaben?

FrostedCookies
quelle
2
Wenn Sie einem Tutorial folgen, würde ich den Stil verwenden, den das Tutorial verwendet, um Fehler beim Umschalten zwischen path()und zu vermeiden url(). Wenn Sie reguläre Ausdrücke verwenden möchten oder müssen, müssen Sie re_path()oder verwenden url(). Darüber hinaus liegt es ganz bei Ihnen, für welches Sie sich entscheiden.
Alasdair

Antworten:

174

Aus der Django-Dokumentation für URL

url(regex, view, kwargs=None, name=None)Diese Funktion ist ein Alias ​​für django.urls.re_path(). Es wird wahrscheinlich in einer zukünftigen Version veraltet sein.

Hauptunterschied zwischen pathund re_pathist daspath die Route ohne Regex verwendet wird

Sie können es re_pathfür komplexe Regex-Aufrufe und nur pathfür einfachere Suchvorgänge verwenden

iklinac
quelle
1
Danke für die detaillierten Infos! re_pathist das, wonach ich dann suche.
FrostedCookies
65

Die neue django.urls.path()Funktion ermöglicht eine einfachere und besser lesbare URL-Routing-Syntax. Zum Beispiel dieses Beispiel aus früheren Django-Versionen:

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

könnte geschrieben werden als:

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

Die django.conf.urls.url() Funktion aus früheren Versionen ist jetzt verfügbar als django.urls.re_path(). Der alte Standort bleibt aus Gründen der Abwärtskompatibilität erhalten, ohne dass eine Verfall unmittelbar bevorsteht. Die alte django.conf.urls.include()Funktion kann jetzt importiert werden, django.urlssodass Sie Folgendes verwenden können:

from django.urls import include, path, re_path

in den URLconfs . Zur weiteren Lektüre django doc

Sylvernus Akubo
quelle
10
Ein wenig irreführend, da Ihr path()Beispiel nicht vierstellige Zahlen zulässt.
BrainCore
Das /<int:year>/bedeutet, dass das Jahr ganzzahlig sein sollte. Ich schlage vor, Sie sehen sich die offizielle Dokumentation an.
Sylvernus Akubo
2
@silvablaze Wie BrainCore sagte, intist nicht gleichbedeutend mit [0-9]{4}. Ob es für ganze Zahlen verwendet wird oder nicht, hat keinen Einfluss auf diese Beziehung. Vielleicht , wenn Sie ersetzt [0-9]{4}mit [0-9]+Ihrem Vergleich könnte weniger ungenau, obwohl Sie noch mit der Art des Endergebnisses zu behandeln (str vs int?) Benötigen.
Jan Kyu Peblik
Das ist die eindeutige Antwort zu diesem Thema. Vielen Dank.
VikasBhat
19

pathist einfach neu in Django 2.0, das erst vor ein paar Wochen veröffentlicht wurde. Die meisten Tutorials wurden für die neue Syntax nicht aktualisiert.

Es sollte sicherlich eine einfachere Art sein, Dinge zu tun; Ich würde nicht sagen, dass die URL leistungsfähiger ist. Sie sollten in der Lage sein, Muster in beiden Formaten auszudrücken.

Daniel Roseman
quelle
9

Reguläre Ausdrücke scheinen mit der path()Funktion mit den folgenden Argumenten nicht zu funktionieren:path(r'^$', views.index, name="index") .

Es sollte so sein: path('', views.index, name="index") .

Das erste Argument muss leer sein, um einen regulären Ausdruck einzugeben.

Dänischer Shaikh
quelle
2
Ja, ich denke, wie oben erwähnt, müssen Sie stattdessen die Funktion re_path () verwenden, um REs zu verwenden.
FrostedCookies
8

Path ist eine neue Funktion von Django 2.0. Hier erklärt: https://docs.djangoproject.com/de/2.0/releases/2.0/#whats-new-2-0

Sehen Sie wie eine pythonischere Methode aus und aktivieren Sie die Verwendung von regulären Ausdrücken in Argumenten, die Sie an die Ansicht übergeben ... Sie können beispielsweise die Funktion int () verwenden.

Denis Cottin
quelle
2

Ab Version 2.0 verwenden viele Benutzer den Pfad, aber wir können entweder den Pfad oder die URL verwenden. In Django 2.1.1 kann die Zuordnung zu Funktionen über die URL beispielsweise wie folgt erfolgen

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'),

]

Dabei ist posts eine Anwendung und post_home eine Funktion in views.py

Nani Chintha
quelle