Django 3 url - представление должно быть вызываемым объектом или списком/кортежем в случае include()

Я новичок в Python и Django. Я переношу проект с 2.x на 3. У меня есть такой код:

urlpatterns += [
        url(r'^media/(?P<path>.*)$', 'django.views.static.serve', {
            'document_root': settings.MEDIA_ROOT,
        }),
    ]

и этот код возвращает мне ошибку:

url(r'^media/(?P<path>.*)$', 'django.views.static.serve', {
  File "/mnt/c/Projekty/GO/.venvs/lib/python3.9/site-packages/django/conf/urls/__init__.py", line 22, in url
    return re_path(regex, view, kwargs, name)
  File "/mnt/c/Projekty/GO/.venvs/lib/python3.9/site-packages/django/urls/conf.py", line 73, in _path
    raise TypeError('view must be a callable or a list/tuple in the case of include().')
TypeError: view must be a callable or a list/tuple in the case of include().

Как я могу его починить? Пожалуйста, помогите мне

Вам нужно работать с самим представлением, а не ссылаться на него по имени:

from django.views.static import serve

urlpatterns += [
    url(
        '^media/(?P<path>.*)$',
        serve,
        {
            'document_root': settings.MEDIA_ROOT,
        },
    ),
]

Но этот путь - не изначально хорошая идея. Автор хотел "обойти" тот факт, что Django не обслуживает статические или медиафайлы в продакшене (DEBUG = False), но на то есть веские причины: обслуживание файлов Django, скорее всего, очень неэффективно как по времени обработки, так и по использованию памяти, оно также не использует кэширование эффективно, и, наконец, представление не очень безопасно.

Обычно вы настраиваете веб-сервер, например nginx, apache или другой, для обслуживания этих файлов, см. раздел serving static files from a dedicated server [Django-doc] для получения дополнительной информации.

Вернуться на верх