Что лучше: использовать path () или url () в urls.py для django 2.0?

131

В онлайн-курсе django инструктор предлагает нам использовать url()функцию для вызова представлений и использования регулярных выражений в списке urlpatterns. Я видел другие примеры этого на YouTube. например

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

Однако, проходя обучение по Django, они path()вместо этого используют, например:

from django.urls import path
from . import views

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

Кроме того, регулярные выражения, похоже, не работают с path()функцией, так как использование path(r'^$', views.index, name="index")не позволяет найти mysite.com/polls/представление.

Является ли использование path()без соответствия регулярному выражению правильным путем? Является url()более мощным , но более сложным , так что они используют , path()чтобы начать нас с? Или это разные инструменты для разных работ?

FrostedCookies
источник
2
Если вы следуете руководству, я бы использовал тот стиль, который используется в учебнике, чтобы избежать ошибок при переключении между path()и url(). Если вы хотите или вам нужно использовать регулярные выражения, вы должны использовать re_path()или url(). Кроме того, я думаю, что действительно вам решать, какой из них вы выберете.
Alasdair

Ответы:

175

Из документации Django для url

url(regex, view, kwargs=None, name=None)Эта функция является псевдонимом django.urls.re_path(). Скорее всего, в будущем выпуске он будет считаться устаревшим.

Ключевое различие между pathи re_pathзаключается в том, что pathиспользует маршрут без регулярного выражения

Вы можете использовать re_pathдля сложных вызовов регулярных выражений и использовать только pathдля более простых поисков

iklinac
источник
1
Спасибо за подробную информацию! re_pathэто то, что я ищу тогда.
FrostedCookies
66

Новая django.urls.path()функция позволяет использовать более простой и понятный синтаксис маршрутизации URL-адресов. Например, этот пример из предыдущих выпусков Django:

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

можно было бы записать как:

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

django.conf.urls.url() Функция из предыдущих версий теперь доступна django.urls.re_path(). Старое расположение остается для обратной совместимости без неминуемого прекращения поддержки. Старая django.conf.urls.include()функция теперь доступна для импорта, django.urlsпоэтому вы можете использовать:

from django.urls import include, path, re_path

в URLconfs . Для дальнейшего чтения django doc

Сильвернус Акубо
источник
10
Немного вводит в заблуждение, поскольку ваш path()пример допускает числа, не являющиеся четырехзначными.
BrainCore
В /<int:year>/означает , что год должен быть в целое число, я предлагаю вам ознакомиться с официальной документацией.
Sylvernus Akubo
2
@silvablaze Как указано в BrainCore, intне эквивалентен [0-9]{4}. Используется ли он для целых чисел или нет, не имеет отношения к этой связи. Возможно, если вы замените его [0-9]{4}на [0-9]+свое сравнение, оно будет менее неточным, хотя вам все равно придется иметь дело с типом конечного результата (str vs int?).
Jan Kyu Peblik 05
Это четкий ответ по этому поводу. Спасибо.
VikasBhat,
19

pathпросто новинка в Django 2.0, выпущенном всего пару недель назад. Большинство руководств не обновлялось с учетом нового синтаксиса.

Определенно предполагалось, что это будет более простой способ делать вещи; Я бы не сказал, что URL-адрес более мощный, вы должны иметь возможность выражать шаблоны в любом формате.

Дэниел Розман
источник
9

Регулярные выражения, похоже, не работают с path()функцией со следующими аргументами:path(r'^$', views.index, name="index") .

Должно получиться так: path('', views.index, name="index") .

Чтобы ввести регулярное выражение, первый аргумент должен быть пустым.

Датский шейх
источник
2
Да, я думаю, как указано выше, чтобы использовать RE, вы должны вместо этого использовать функцию re_path ().
FrostedCookies
8

Путь - это новая функция Django 2.0. Объясняется здесь: https://docs.djangoproject.com/en/2.0/releases/2.0/#whats-new-2-0

Похоже на более питонический способ и разрешите не использовать регулярное выражение в аргументе, который вы передаете для просмотра ... вы можете использовать функцию int (), например.

Денис Коттин
источник
2

Начиная с версии 2.0 многие пользователи используют путь, но мы можем использовать либо путь, либо URL-адрес. Например, в django 2.1.1 сопоставление функций через URL-адрес можно выполнить следующим образом

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

]

где сообщения - это приложение, а post_home - это функция в views.py

Нани Чинта
источник