带有 React 前端的 Django 后端

Posted

技术标签:

【中文标题】带有 React 前端的 Django 后端【英文标题】:Django back end with a React front end 【发布时间】:2017-03-04 20:22:49 【问题描述】:

想法

我已经开始构建这种社交媒体类型的网站,其中包括基本的社交媒体页面,例如个人资料、状态提要、搜索、事件等。每个页面都是一个单独的 django 模板,数据通过使用 django 模板引擎中的变量进行可视化。但此时,我想使用 ReactJS 将这些静态页面更改为更动态的页面。

但是怎么做呢?

我想让页面动态化,但它仍然应该是一个 多页面 网站,其 URL 类似于 /user/<id>。我想出了以下选项:

每个页面都有一个模板。每页有一个捆绑包。让 Django 处理路由。

为每个页面创建一个单独的 Django 模板,就像普通的 Django 应用程序一样。 使用django-webpack-loader 加载包。 每个页面都有一个单独的包。通过在webpack.config.js 中添加多个条目来创建捆绑包。当我们有 40 多个不同的页面时,这可能会导致相当多的入口点。 URL 由 Django 处理,并且可由 React 通过模板中的公共 javascript 变量访问。 Example。页面的其他初始数据(如用户名、头像、个人资料信息)也通过 Django 模板引擎加载到此变量中。 无需重新加载页面的表单验证等动态功能由 React 和使用 django-rest-framework 的 Django Rest API 处理。

那么?

这是处理此问题的正确方法吗? 我在弄清楚如何将 django 模板变量(例如 request.user)获取到 React 可访问的 javascript 变量时遇到了一些麻烦。 如果是这样,我应该如何构建这样的应用程序? 可以为每个单独的页面打包吗?例如,所有页面都有相同的标题。在每个包中包含这个标头似乎有点过头了。

【问题讨论】:

【参考方案1】:

你的计划应该可行,但我认为你应该考虑你的应用程序有多少是动态的。

如果您只需要几个页面即可拥有来自 React 的动态功能,那么只需放入一些自包含的 React 组件并按照您的计划将它们分开捆绑可能是个好主意。但是,如果您的大部分项目都需要是动态的,我认为最好忘记大多数页面的 Django 模板,而只需创建一个可靠的 API 后端供 React 使用。

这是一个快速示例,说明如何配置 webpack 以捆绑您的 react 组件:

这是一个大型 Django 项目的摘录,我们在该项目中使用了几个 React 组件。 bundle 有一堆其他的 javascript 东西,report 是一个独立的 React 组件:

webpack.config.js

    ...
    entry: 
        bundle: './server/apps/core/static/core/app.js',
        report: './server/apps/reports/static/reports/js/app.jsx'
    ,
    output: 
      path: path.resolve('./server/apps/core/static/core/bundles'),
      path: path.resolve('./server/apps/core/static/core/bundles'),
      filename: 'bundle.js' + filename: '[name].js'
    ,
    resolve: 
      extensions: ['', '.js', '.jsx']
    ,
    ...

然后在模板中粘贴你想要的组件吧:

% block content %
    <div id="root"></div>
% endblock content %
% block extrascripts %
    <script type="text/javascript">
        var dataUrl = "% url 'reports:data-chart' %";
    </script>
    <script src="% static 'core/bundles/report.js' %"></script>
% endblock extrascripts %

我有另一个例子here 可能有助于玩弄。我需要更新它,但它更像是使用 React 和 Django REST 框架的样板,并在 Django 模板系统之前。

希望这会有所帮助。

【讨论】:

想一个常见的网站布局:页眉、内容、页脚。标题有一些动态组件:带有即时搜索的搜索栏、下拉菜单。页脚是完全静态的。内容取决于页面。个人资料页面可以有一些动态组件:状态提要、弹出窗口。注册页面需要表单验证而无需重新加载页面。我一直认为 React 不是最好的解决方案,因为它有点矫枉过正。【参考方案2】:

这当然是一门可行的课程。

这有一些很好的解决方案可以解决您关于将模板变量转换为 React 的 JS 变量的问题:How do I insert a Django template variable into a React script?

您应该能够捆绑任何组合的 JS 并构建您的模板,以便每个都提取适当的捆绑包。例如,我希望您有一个包含标题(和任何其他站点范围的 html)的基本模板,然后为您的各个页面扩展该模板。

【讨论】:

以上是关于带有 React 前端的 Django 后端的主要内容,如果未能解决你的问题,请参考以下文章

使用 React 和 Django REST Framework 构建你的网站

如何在带有 Django Rest 框架的 React 前端使用 Django 用户组和权限

使用 Django Rest Framework 构建的后端 Json 在前端以某种方式未定义,使用 React 构建

带有嵌套查询(Django + React)的 Graphql 瓶颈性能使前端应用程序无法使用。请帮忙 :'(

将单独的 Dyno 用于反应前端和 Django 后端时的 Cookie

网络错误 Django 后端反应前端