добавление static () в urlpatterns работает только путем добавления в список - PullRequest
0 голосов
/ 10 мая 2018

Я почти уверен, что там лежит дубликат, но не смог его найти.

При объявлении urlpatterns в urls.py в dev я успешно использую следующее:

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 Ответ

0 голосов
/ 10 мая 2018

Что ж, статическая функция не возвращает один url, поэтому вы не можете добавить его в качестве одного элемента в список. Используя +=, вы фактически добавляете в список все элементы результата вызова static.

Последние версии Python, однако, имеют специальный синтаксис для включения итерируемого в список с помощью звездочки (*), поэтому это все еще можно сделать с помощью:

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