Как предоставить данные для реакции с помощью drf без дополнительных запросов?
Я создаю одностраничное приложение с react и django rest framework. Я хочу иметь возможность изменять "статическую" информацию через интерфейс администратора django, чтобы избежать ненужного дополнительного развертывания каждый раз. Такая информация, как фоновое изображение и текст из раздела about.
Для его редактирования я создаю cms
django app и регистрирую модели в admin.
Для обслуживания фронтенда в продакшене я использую TemplateView
из пакета django.views.generic
. Он обслуживает html файл из каталога react app. вот часть корневого urls.py:
urlpatterns = [
path('admin/', admin.site.urls),
# ...
# api endpoints here
# ...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
urlpatterns += [re_path(r'^.*', TemplateView.as_view(template_name='index.html'))]
для его обслуживания в разработке я использую react-scripts start
из create-react-app
Как я могу передать туда такую информацию, как текущий url фонового изображения, текст для раздела about и т.д.?
Простой вариант - создать кучу представлений для получения этой информации и запросить все данные из react app, но мне не очень нравится такой подход.
Другой вариант - переопределить TemplateView следующим образом
from django.views import generic
class TemplateView(generic.TemplateView):
template_name = 'index.html'
def get_context_data(self, **kwargs):
context_data = dict()
# get all data from db here
return context_data
Но как тогда мне использовать это в приложении react? В производстве и в разработке.
Я считаю, что должен быть правильный способ решения такой проблемы.
Одно из возможных решений, которое я нашел, это жестко закодировать url фонового изображения на фронтенде и создать или обновить симлинк, соответствующий этому url. Таким образом, когда я загружаю новое изображение в админке django, за сценой сохраняется запись в базе данных, сохраняется сам файл и обновляется симлинк. Таким образом, я также могу установить другое изображение как активное, просто обновляя симлинк в процессе сохранения. Это решение выглядит хорошо для меня, но работает только для статических файлов, а не для текстовых данных.