Как обслуживать статические файлы (например, изображения) в комбинированном приложении django-react
Это первое веб-приложение, которое я разрабатываю, сочетая django и react, на самом деле react - новинка для меня. Пожалуйста, если мой подход неверен, я открыт для исправлений. При разработке исключительно на django, я не нахожу трудностей со статическими и медиа файлами. Как я понимаю, речь идет о таких элементах, как media root и static root, соответственно. В таком случае мне достаточно указать корень static/media в файле settings.py в приложении django, как показано ниже:
settings.py
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
STATIC_URL = '/static/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media/')
MEDIA_URL = '/media/images/'
urls.py
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) \
+ static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
Однако, когда я объединяю django и react, конфигурация меняется, поскольку django настроен
на просмотр файла index.html
в react, и в этом случае дополнительный элемент под названием STATICFILES DIRS
добавляется в файл seetings.py для указания пути к файлу react index.html
. На самом деле, моя конфигурация django app
выглядит следующим образом, когда я объединяю django и react:
settings.py
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'build/static')]
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media/')
MEDIA_URL = '/media/images/'
urls.py
urlpatterns = [
...
re_path(r'^.*', TemplateView.as_view(template_name='index.html'))
]
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) \
+ static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
TEMPLATES = [
{
...
'DIRS': [os.path.join(BASE_DIR, 'build')],
...
]
Все работает хорошо, как при разработке чисто на django, за исключением того, что когда я комбинирую django и react в разработке изображения, которые я загружаю, отказываются отображаться в браузере, т.к. любой путь, который совпадает с указанными путями, перенаправляется в браузер.
в браузере, так как любой путь, который не совпадает с указанными путями в urlpattern
, перенаправляется
на react. re_path(r'^.*', TemplateView.as_view(template_name='index.html'))
Итак, путь к изображению перенаправляется. Когда я нажимаю на ссылку изображения в файле администратора, вместо того, чтобы
изображение отображается, я также перенаправляюсь на react. Я провел исследование в Интернете, но не смог найти ни одного ресурса.
которые бы объясняли, как правильно настроить статический корень django и корень media, чтобы иметь возможность обслуживать файлы (
например, изображения, загруженные в базу данных) контент.
Что мне нужно сделать для отображения изображений и медиа в браузере? В продакшене я хотел бы обслуживать статические файлы из приложения
django-react app с aws s3 bucket, и мои static и media root будут заменены на следующие:
AWS_ACCESS_KEY_ID = os.getenv('AWS_ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = os.getenv('AWS_SECRET_ACCESS_KEY')
AWS_STORAGE_BUCKET_NAME = os.getenv('AWS_STORAGE_BUCKET_NAME')
AWS_DEFAULT_ACL = None #'public-read'
AWS_S3_CUSTOM_DOMAIN = f'{AWS_STORAGE_BUCKET_NAME}.s3.amazonaws.com'
AWS_S3_OBJECT_PARAMETERS = {'CacheControl': 'max-age=31536000'}
AWS_LOCATION = 'static'
STATIC_URL = f'https://{AWS_S3_CUSTOM_DOMAIN}/{AWS_LOCATION}/'
STATICFILES_STORAGE = 'core.storage_backends.StaticStorage'
PUBLIC_MEDIA_LOCATION = 'media'
MEDIA_URL = f'https://{AWS_S3_CUSTOM_DOMAIN}/{PUBLIC_MEDIA_LOCATION}/'
DEFAULT_FILE_STORAGE = 'core.storage_backends.MediaStorage'
Причина, по которой я добавил этот аспект aws s3, заключается в том, что я хочу получить решение, которое будет применимо как на уровне разработки, так и на уровне производства.
Проверьте, что вы добавили папку сборки в установленные приложения
INSTALLED_APPS = [ build, ]
Если DEBUG, используйте STATICFILES_DIRS, иначе используйте STATIC_ROOT. Добавьте этот код в файл settings.py.
if DEBUG: STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')] else: STATIC_ROOT = os.path.join(BASE_DIR, 'static')
В файле urls.py
urlpatterns += [re_path(r'^.*', TemplateView.as_view(template_name='index.html'))]
Затем выполните python manage.py collectstatic
Вам также следует установить whitenoise pip install whitenoise