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

Posted

技术标签:

【中文标题】将 static() 添加到 urlpatterns 只能通过附加到列表来工作【英文标题】:adding static() to urlpatterns only work by appending to the list 【发布时间】:2018-10-20 19:21:22 【问题描述】:

我很确定周围有复制品,但找不到。

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

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

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

【问题讨论】:

【参考方案1】:

静态函数确实返回单个url,因此您不能将它作为单个元素添加到列表中。通过使用+=,您实际上将static 调用结果的所有元素 附加到列表中。

然而,最新版本的 Python 具有特殊语法,可以通过使用星号 (*) 在列表中包含可迭代对象,因此仍然可以使用:

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

【讨论】:

以上是关于将 static() 添加到 urlpatterns 只能通过附加到列表来工作的主要内容,如果未能解决你的问题,请参考以下文章

django部署后样式丢失解决办法

无法加载静态文件

django在url中配置静态资源

django在url中配置静态资源

我无法将表单数据保存到 django 中的数据库

Django静态图像文件无法加载资源