将 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 只能通过附加到列表来工作的主要内容,如果未能解决你的问题,请参考以下文章