¿Es mejor usar path () o url () en urls.py para django 2.0?

131

En un curso en línea de django, el instructor nos hace usar la url()función para llamar vistas y utilizar expresiones regulares en la lista de patrones de url. He visto otros ejemplos en YouTube de esto. p.ej

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

Sin embargo, al seguir el tutorial de Django, usan path()en su lugar, por ejemplo:

from django.urls import path
from . import views

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

Además, las expresiones regulares no parecen funcionar con la path()función, ya que el uso de a path(r'^$', views.index, name="index")no encuentra la mysite.com/polls/vista.

¿ path()Usar sin expresiones regulares coincide con la forma correcta en el futuro? ¿Es url()más poderoso pero más complicado por lo que están usando path()para comenzar? ¿O es un caso de diferentes herramientas para diferentes trabajos?

Galletas Heladas
fuente
2
Si sigue un tutorial, usaría cualquier estilo que use el tutorial, para evitar errores al cambiar entre path()y url(). Si quiere o necesita usar expresiones regulares, debe usar re_path()o url(). Más allá de eso, creo que depende de ti cuál elijas.
Alasdair

Respuestas:

174

De la documentación de Django para url

url(regex, view, kwargs=None, name=None)Esta función es un alias para django.urls.re_path(). Es probable que quede obsoleto en una versión futura.

La diferencia clave entre pathy re_pathes que pathusa la ruta sin expresiones regulares

Puede usar re_pathpara llamadas de expresiones regulares complejas y usar solo pathpara búsquedas más simples

iklinac
fuente
1
¡Gracias por la informacion detallada! re_pathes lo que estoy buscando entonces.
FrostedCookies
65

La nueva django.urls.path()función permite una sintaxis de enrutamiento de URL más simple y legible. Por ejemplo, este ejemplo de versiones anteriores de Django:

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

podría escribirse como:

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

La django.conf.urls.url() función de versiones anteriores ahora está disponible como django.urls.re_path(). La ubicación anterior sigue siendo compatible con versiones anteriores, sin una degradación inminente. La antigua django.conf.urls.include()función ahora es importable django.urlspara que pueda usar:

from django.urls import include, path, re_path

en las URLconfs . Para más información django doc

Sylvernus Akubo
fuente
10
Un poco engañoso ya que su path()ejemplo permite números que no son de cuatro dígitos.
BrainCore
Las /<int:year>/significa que el año debe ser en número entero, le sugiero que busque a través de la documentación oficial.
Sylvernus Akubo
2
@silvablaze Como BrainCore declaró, intno es equivalente a [0-9]{4}. Si se usa para enteros o no, no tiene relación con esta relación. Quizás si lo reemplazara [0-9]{4}con [0-9]+su comparación podría ser menos impreciso, aunque es posible que aún deba tratar con el tipo del resultado final (str vs int?).
Jan Kyu Peblik
Esa es la respuesta clara sobre el tema. Gracias.
VikasBhat
19

pathes simplemente nuevo en Django 2.0, que solo se lanzó hace un par de semanas. La mayoría de los tutoriales no se habrán actualizado para la nueva sintaxis.

Ciertamente se suponía que era una forma más simple de hacer las cosas; Sin embargo, no diría que la URL es más poderosa, debería poder expresar patrones en cualquier formato.

Daniel Roseman
fuente
9

Las expresiones regulares no parecen trabajo con la path()función con los siguientes argumentos: path(r'^$', views.index, name="index").

Debe ser como la siguiente: path('', views.index, name="index").

El primer argumento debe estar en blanco para ingresar una expresión regular.

Shaikh danés
fuente
2
Sí, creo que, como se señaló anteriormente, para usar RE, debe usar la función re_path () en su lugar.
FrostedCookies
2

Desde la v2.0, muchos usuarios usan la ruta, pero podemos usar la ruta o la URL. Por ejemplo, en django 2.1.1, la asignación a funciones a través de url se puede hacer de la siguiente manera

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

]

donde posts es una aplicación y post_home es una función en views.py

Nani Chintha
fuente