【问题标题】:Is it better to use path() or url() in urls.py for django 2.0?在 django 2.0 的 urls.py 中使用 path() 或 url() 会更好吗?
【发布时间】:2018-06-05 11:19:00
【问题描述】:

在 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() 来开始我们?还是说不同的工具适用于不同的工作?

【问题讨论】:

  • 如果您正在学习教程,我会使用教程使用的任何样式,以防止在path()url() 之间切换时出错。如果您想要或需要使用正则表达式,那么您必须使用re_path()url()。除此之外,我认为这真的取决于你选择哪一个。

标签: python django django-urls


【解决方案1】:

来自 url 的 Django 文档

url(regex, view, kwargs=None, name=None)这个函数 是django.urls.re_path() 的别名。它很可能在 未来的版本。

pathre_path 之间的主要区别在于 path 使用没有正则表达式的路由

您可以使用re_path 进行复杂的正则表达式调用,而只使用path 进行更简单的查找

【讨论】:

    【解决方案2】:

    新的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

    【讨论】:

    • 有点误导,因为您的 path() 示例允许非四位数字。
    • /&lt;int:year&gt;/表示年份应该是整数,建议你看一下官方文档。
    • @silvablaze 正如 BrainCore 所说,int 不等同于 [0-9]{4}。是否用于整数与这种关系无关。也许如果您将[0-9]{4} 替换为[0-9]+,您的比较可能会不那么准确,尽管您可能仍需要处理最终结果的类型(str 与 int?)。
    【解决方案3】:

    从 v2.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'),
    
    ]
    

    posts 是一个应用程序,而 post_home 是 views.py 中的一个函数

    【讨论】:

      【解决方案4】:

      路径是 Django 2.0 的一个新特性。 在这里解释: https://docs.djangoproject.com/en/2.0/releases/2.0/#whats-new-2-0

      看起来更像pythonic方式,并允许在传递给视图的参数中不使用正则表达式...您可以使用 int() 函数作为示例。

      【讨论】:

        【解决方案5】:

        正则表达式似乎不适用于带有以下参数的 path() 函数:path(r'^$', views.index, name="index")

        应该是这样的:path('', views.index, name="index")

        第一个参数必须为空才能输入正则表达式。

        【讨论】:

        • 是的,我认为如上所述要使用 RE,您必须改用 re_path() 函数。
        【解决方案6】:

        path 只是几周前才发布的 Django 2.0 中的新功能。大多数教程不会针对新语法进行更新。

        这当然应该是一种更简单的做事方式;不过,我不会说 URL 更强大,您应该能够以任何一种格式表达模式。

        【讨论】:

          猜你喜欢
          • 2018-06-15
          • 2022-11-13
          • 2014-05-21
          • 1970-01-01
          • 2018-05-31
          • 2015-05-06
          • 1970-01-01
          • 2011-04-14
          • 2017-06-01
          相关资源
          最近更新 更多