Изображения в django не отображаются в react
Это приложение, в котором я использую django backend и react frontend. Изображения отображаются в react, когда я держу react и django
отдельно и общаюсь просто с API. Однако я хочу развернуть и фронтенд, и бэкенд вместе.
Я пытаюсь использовать django re_path для перенаправления любого url, который не совпадает с urls, указанными в django urls.py. Всякий раз, когда я делаю
изображения из react и django перестают отображаться. И django, и react теряют путь к изображениям.
project structure
>backend
...
settings.py
urls.py
>blog
...
urls.py
serializers.py
views.py
>frontend
...
build
src
package.json
manage.py
>static
urls.py
urlpatterns = [
path('admin/', admin.site.urls),
path('api/', include('djoser.urls')),
path('api/', include('djoser.urls.jwt')),
path('api/', include('accounts.urls')),
path('summernote/',include('django_summernote.urls')),
path('api/blog/', include('blog.urls')),
re_path('*', TemplateView.as_view(template_name='index.html')),
]
settings.py
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [
os.path.join(BASE_DIR, 'frontend/build')
],
'APP_DIRS': True,
},
]
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static',),
os.path.join(BASE_DIR, 'frontend/build/static'),
]
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media/')
Кроме того, всякий раз, когда я использую re_path для перенаправления несовпадающих адресов с django на react, изображения в react, такие как логотип, перестают отображаться, но без установки re_path все изображения в react, включая логотипы и иконки, появляются. Как мне это исправить?
Я наконец-то исправил это, используя path вместо re_path. Мне пришлось изменить re_path('*', TemplateView.as_view(template_name='index.html')) на re_path(''', TemplateView.as_view(template_name='index.html')). Я не знаю, произошли ли изменения относительно использования repath в Django 4.0
Если синтаксис путей и конвертеров недостаточен для определения шаблонов URL, вы также можете использовать регулярные выражения. Для этого используйте re_path() вместо path().
Поэтому вы не можете написать "*".
В моем случае
re_path(r'^(?P<path>.*)$'...)
будет соответствовать любому пути
Кстати. Если вы используете django-react. вы не можете использовать re_path для front-end Template. Пример:
re_path(r'^(?P<path>.*)$',TemplateView.as_view(template_name='index.html')),
Делать это приведет к ошибке corsheader при загрузке изображений