我处理它的方式(也是用 DJANGO 编写的后端)是我的 react 应用程序使用 NodeJs 进行服务器端渲染和转发 api 请求。这允许我将 Node 服务器上的请求转发到 django 服务器。
看看这个 nodejs - express 服务器实现:
import path from 'path'
import express from 'express'
import compression from 'compression'
import React from 'react'
import { renderToString } from 'react-dom/server'
import { match, RouterContext } from 'react-router'
import configureStore from 'data/redux/store';
import proxy from 'http-proxy-middleware';
import { Provider } from 'react-redux';
import { IntlProvider } from 'react-intl';
import routes from './routes';
const store = configureStore();
const app = express();
app.use(compression());
//template engine
app.set('view engine', 'ejs');
//where to look for templates
app.set('views', path.join(__dirname, '/public'));
//Serve static files
app.use(express.static(path.join(__dirname, '/public'), { index: false }));
//middleware for handling api request
app.use('/api/*', proxy({
target: process.env.API_HOST,
pathRewrite: { '^/api/': '' },
changeOrigin: true,
secure: false,
}));
app.use('/media/*', proxy({
target: process.env.API_HOST,
changeOrigin: true,
secure: false,
}));
app.get('*', (req, res) => {
match({ routes: routes(store), location: req.url }, (err, redirect, props) => {
if (err) {
res.status(500).send(err.message)
} else if (redirect) {
res.redirect(redirect.pathname + redirect.search)
} else if (props) {
const appHtml = renderToString(
<Provider store={store}>
<IntlProvider locale="en">
<RouterContext store={store} {...props} />
</IntlProvider>
</Provider>
);
res.render('index', { appHtml });
} else {
res.status(404).send('Not Found')
}
})
});
const PORT = process.env.PORT || 8080;
app.listen(PORT, function () {
console.log('Production Express server running at localhost:' + PORT)
});
所以我有 NodeJS 服务器,它服务器响应应用程序并处理以 /api/ 开头的传入请求,方法是将它们转发到 django 服务器并将响应返回给客户端。