部署单独的 React Frontend 和 Django DRF API

IT技术 django reactjs create-react-app amazon-elastic-beanstalk
2021-05-06 16:37:22

我有一个react前端,create-react-app用于部署我刚刚做的生产版本npm run build我的应用程序使用 Django Rest FrameWork API 后端。

如何设置应用程序以在单个服务器上部署。有没有一种方法可以存储 React Frontend 并在 Django 中路由到它,并使来自 Frontend 的请求命中api/视图或端点。

部署这样的东西的最佳策略是什么,或者在不同的服务器上拼命托管前端和后端更好?

基本上:如何将我的 React 前端构建合并到 Django DRF 中进行部署?

2个回答

您可以将 django 用作 React 应用程序的容器。在您的 React 项目根文件夹中运行“npm run build”。它将生成构建目录并捆绑所有 javascript 文件。将此构建文件夹放在 django 项目的根目录中。并在 settings.py 文件中进行以下更改:

STATICFILES_DIRS = (
    ...
     os.path.join(BASE_DIR, 'build/static'),
     os.path.join(BASE_DIR, 'build')
...
)

并在 urls.py 中输入如下内容:-

url(r'^$', mView.login, TemplateView.as_view(template_name = 'index.html'))

使用“axios”或本机 fetch api 从 react 应用程序进行 api 调用。

在此之后,每当您点击 django 项目的 url 时,它都会被重定向到 react 应用程序。您可以使用 apache wsgi 托管它。对我来说很好用。

以下链接可能会有所帮助:https : //medium.com/alpha-coder/heres-a-dead-simple-react-django-setup-for-your-next-project-c0b0036663c6

我所做的是在提供静态内容(构建的react应用程序)之后,在 DRF API 中有入口点,它有一个模板,在clientConfig对象中设置服务器上下文(如果你想设置任何)

此外,您需要为每个端点创建一个单独的“初始化程序”脚本,其中包含react路由,为它提供正确的选择器,您将在 Django 模板中提到。

网址: path('foobars', views.FooBarsView.as_view(), name='foobars')

查看

class FooBarsView(TemplateView):
    template_name = 'foobars.html'

    def get_context_data(self):
        return {
            "client_config": {}
        }

模板(foobars.html)

{% load static from staticfiles %}

<head>
    <link rel="stylesheet" href="{% static 'dist/css/foobars.css' %}"/>
</head>

<main class="foobars"></main>

<script type="text/javascript">
    var clientConfig = {{ client_config|safe }};
</script>

<script type="text/javascript" src="{% static "dist/js/foobars.min.js" %}"></script>

您必须在 React 应用程序中进行一些更改,即.foobarsrender方法中使用选择器

初始化程序

ReactDOM.render(
    <Provider store={store}>
        <Router history={history}>
            <Switch>
                <Route name="index" exact path="/" component={FooBarComponent} />
            </Switch>
        </Router>
    </Provider>,
    document.querySelector(".foobars")
);