首页 > 解决方案 > 如何在没有额外请求的情况下提供数据以与 drf 做出反应?

问题描述

我用 react 和 django rest 框架构建了一个单页应用程序。我希望能够通过 django 管理界面更改“静态”信息,以避免每次都进行不必要的额外部署。诸如背景图像和关于部分的文本之类的信息。

要编辑它,我创建cmsdjango 应用程序并在管理员中注册模型。

为了在生产中服务前端,我使用TemplateViewdjango.views.generic中的。它从捆绑的 react app 目录提供 html 文件。这是根 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、关于部分的文本等信息?

简单的选择是创建一堆视图以获取此信息并从反应应用程序请求所有数据,但我不太喜欢这种方法。

另一种选择是像这样重新定义 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

但是我如何在反应应用程序中使用它呢?在生产和开发中。

我相信应该有正确的方法来解决这样的问题。

标签: reactjsdjangorestdjango-rest-frameworksingle-page-application

解决方案


我发现的一种可能的解决方案是将 url 硬编码为前端的背景图像,并创建或更新与此 url 对应的符号链接。因此,当我在 django admin 上上传新图像时,它会在后台将记录保存在数据库中,保存文件本身并更新符号链接。通过这种方式,我还可以将另一个图像设置为活动,只是在保存过程中更新符号链接。该解决方案对我来说看起来不错,但仅适用于静态文件,不适用于文本数据。


推荐阅读