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] для получения дополнительной информации.