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

yiv*_*ivi 6 python django django-urls python-3.x

我很确定周围有重复的,但是找不到。

在dev的urls.py中声明a urlpatterns时,我成功使用了以下命令:

urlpatterns = [
    # some routes
]

urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
Run Code Online (Sandbox Code Playgroud)

可以理解,哪个可行。

但是,如果我尝试以下操作:

urlpatterns = [
    # some routes,
    static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
]
Run Code Online (Sandbox Code Playgroud)

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 [
    re_path(r'^%s(?P<path>.*)$' % re.escape(prefix.lstrip('/')), view, kwargs=kwargs),
]
Run Code Online (Sandbox Code Playgroud)

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

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

Wil*_*sem 7

那么静态函数并不会返回单个url,所以你不能将其添加为一个单一的元素到列表中。通过使用+=,您实际上将调用结果的所有元素附加static到列表中。

但是,Python的最新版本具有特殊的语法,可以通过使用星号(*)将可迭代项包含在列表中,因此仍可以使用以下方法完成:

urlpatterns = [
    # some routes,
    *static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
]
Run Code Online (Sandbox Code Playgroud)