将 static() 添加到 urlpatterns 只能通过附加到列表来工作

adding static() to urlpatterns only work by appending to the list

我很确定周围有一个副本,但找不到它。

urls.py 中声明 urlpatterns 时,我成功地使用了以下内容:

urlpatterns = [
    # some routes
]

urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

这是可以理解的,有效。

但如果我尝试以下操作:

urlpatterns = [
    # some routes,
    static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
]

django 服务器死机抱怨:

?: (urls.E004) Your URL pattern [<URLPattern '^static\/(?P<path>.*)$'>] is invalid. Ensure that urlpatterns is a list of path() and/or re_path() instances.

为什么这两个定义不等价? static()的return应该是一样的:

return [
    re_path(r'^%s(?P<path>.*)$' % re.escape(prefix.lstrip('/')), view, kwargs=kwargs),
]

因此有效,但仅当我将元素连接到列表而不是直接在列表中定义它时才有效。

为什么一种方法有效而另一种方法无效?

好吧,静态函数不是return单个url,因此您不能将其添加为单个 元素添加到列表中。通过使用 +=,您实际上将 static 调用结果的所有 元素 添加到列表中。

但是 Python 的最新版本有特殊的语法,可以通过使用星号 (*) 在列表中包含一个可迭代对象,所以它仍然可以通过以下方式完成:

urlpatterns = [
    # some routes,
    <b>*</b>static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
]