我有一个用create-react-app
制作的反应前端来部署这个的生产版本我只做npm run build
。我的应用程序使用Django Rest FrameWork API后端。
如何在单个服务器上设置应用程序以进行部署。有没有办法可以存储React前端并在Django中路由它,并且来自前端的请求命中了api/
视图或端点。
部署这样的东西的最佳策略是什么,或者更好地在不同的服务器上拼命地托管前端和后端?
基本上:如何将我的反应前端构建组合到Django DRF中进行部署?
您可以使用django作为您的反应应用程序的容器。在您的react项目根文件夹中运行“npn run build”。它将生成构建目录并捆绑所有javascript文件。将此build文件夹放在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'或native fetch api从react app发出api调用。
在此之后每当你点击django项目的url时,它都会被重定向到react应用程序。你可以用apache wsgi来托管这个。对我来说很好。
我所做的是在提供静态内容(内置的反应应用程序)之后,DRF API中有入口点,它有一个模板,在clientConfig
对象中设置服务器上下文(如果你想设置任何内容)。
此外,您需要为每个端点创建一个单独的“初始化程序”脚本,并在其中包含反应路由,为其提供正确的选择器,您将在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应用程序中进行一些更改,即在.foobars
方法中使用选择器render
。
初始化:
ReactDOM.render(
<Provider store={store}>
<Router history={history}>
<Switch>
<Route name="index" exact path="/" component={FooBarComponent} />
</Switch>
</Router>
</Provider>,
document.querySelector(".foobars")
);