É melhor usar path () ou url () em urls.py para o django 2.0?

131

Em um curso on-line de django, o instrutor usa a url()função para chamar visualizações e utilizar expressões regulares na lista de padrões de URL. Eu já vi outros exemplos no youtube disso. por exemplo

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

No entanto, ao seguir o tutorial do Django, eles usam, path()por exemplo:

from django.urls import path
from . import views

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

Além disso, expressões regulares não parecem funcionar com a path()função, pois usar a path(r'^$', views.index, name="index")não encontrará a mysite.com/polls/visualização.

O uso path()sem regex corresponde à maneira correta daqui para frente? É url()mais poderoso, mas mais complicado, então eles estão usando path()para começar? Ou é um caso de ferramentas diferentes para trabalhos diferentes?

GeadaCookies
fonte
2
Se você estiver seguindo um tutorial, eu usaria o estilo que o tutorial usar, para evitar erros ao alternar entre path()e url(). Se você deseja ou precisa usar expressões regulares, deve usar re_path()ou url(). Além disso, acho que é realmente você quem escolhe.
Alasdair

Respostas:

174

Da documentação do Django para url

url(regex, view, kwargs=None, name=None)Esta função é um alias para django.urls.re_path(). É provável que seja preterido em uma versão futura.

A principal diferença entre pathe re_pathé que pathusa rota sem regex

Você pode usar re_pathpara chamadas regex complexas e usar apenas pathpara pesquisas mais simples

iklinac
fonte
1
Obrigado pela informação detalhada! re_pathé o que estou procurando então.
FrostedCookies
65

A nova django.urls.path()função permite uma sintaxe de roteamento de URL mais simples e legível. Por exemplo, este exemplo de versões anteriores do Django:

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

poderia ser escrito como:

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

A django.conf.urls.url() função das versões anteriores agora está disponível como django.urls.re_path(). O local antigo permanece para compatibilidade com versões anteriores, sem uma depreciação iminente. A django.conf.urls.include()função antiga agora é importável django.urlspara que você possa usar:

from django.urls import include, path, re_path

nos URLconfs . Para leitura adicional django doc

Sylvernus Akubo
fonte
10
Um pouco enganador, já que seu path()exemplo permite números que não são de quatro dígitos.
BrainCore
O /<int:year>/significa que o ano deve ser inteiro, eu sugiro que você olhe através da documentação oficial.
Sylvernus Akubo
2
@silvablaze Como o BrainCore afirmou, intnão é equivalente a [0-9]{4}. Se ele é usado para números inteiros ou não, não tem relação com esse relacionamento. Talvez se você substituiu [0-9]{4}por [0-9]+sua comparação possa ser menos impreciso, embora ainda seja necessário lidar com o tipo de resultado final (str vs int?).
Jan Kyu Peblik 05/07/19
Essa é a resposta clara sobre o assunto. Obrigado.
VikasBhat
19

pathé simplesmente novo no Django 2.0, que foi lançado apenas algumas semanas atrás. A maioria dos tutoriais não foi atualizada para a nova sintaxe.

Certamente era para ser uma maneira mais simples de fazer as coisas; Eu não diria que o URL é mais poderoso, você deve poder expressar padrões nos dois formatos.

Daniel Roseman
fonte
9

As expressões regulares não parecem trabalhar com a path()função com os seguintes argumentos: path(r'^$', views.index, name="index").

Deve ser assim: path('', views.index, name="index").

O primeiro argumento deve estar em branco para inserir uma expressão regular.

Danish Shaikh
fonte
2
Sim, acho que, como indicado acima, para usar REs, você deve usar a função re_path ().
precisa saber é o seguinte
2

A partir da v2.0, muitos usuários estão usando o caminho, mas podemos usar o caminho ou o URL. Por exemplo, no django 2.1.1, o mapeamento para funções através da url pode ser feito da seguinte maneira

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

]

onde posts é um aplicativo e post_home é uma função em views.py

Nani Chintha
fonte