use*_*541 6 deployment django web-applications reactjs
我用django构建一个漂亮的Web应用程序并做出反应,我想部署它,在开发过程中我曾经不得不分离在我的sys,django应用程序和反应js app上的不同端口上运行的应用程序.我正在使用axios连接我的前端和后端.现在我想我完成了我的第一个版本的我的网络应用程序,我想部署它,我理解它不是那么简单,因为我想,我很沮丧,我找不到正确的方法.
我的问题是使用这两个平台构建此类项目的最佳方法是什么?有一种方法,我可以开发这个应用程序,并使这项工作作为开发生产?我怎样才能在dev上使用相对的http请求,因为它的服务器不同?
我不需要完美的方式,因为它的第一个版本,我第一次这样做,我想要正确的方式开始并将我的第一个应用程序部署到互联网..
Tho*_*ang 16
首先,您应该考虑您希望前端和后端的孤立程度.有几种方法可以部署React + Django.
使用Nginx提供静态文件
我认为第一种方式,更简单的方法是将其直接集成到您的反向代理中,例如NGINX.您可以像使用任何静态html站点一样直接为NGINX提供已编译的React应用程序包 - 将其放入/ var/www /并直接提供.然后你可以使用/ api将你的url映射到端口8000上的Django.你的部分内容nginx.conf可能如下所示:
server {
server_name your-server-host;
root /home/www; # this is the parent directory of where you copied your React bundle to
location /api {
proxy_pass http//your-server-host:8000/; # this is where you point it to the Django server
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location / {
try_files $uri $uri/ /index.html; # this is where you serve the React build
}
}
Run Code Online (Sandbox Code Playgroud)
直接从Django提供React
服务于此的第二种方法是让Django处理后端并让React处理Django的前端,而不是Django的模板系统.请注意,这与在一个端口上提供Django和在另一个端口上提供React不同.在这里,您只是为Django应用程序服务,在Django的静态资产中使用React构建包,因此它将作为任何其他静态资产提供.为了说明,请查看根URL conf:
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^api/', include('yourapi.urls')),
url(r'^.*', TemplateView.as_view(template_name="index.html")
]
Run Code Online (Sandbox Code Playgroud)
请注意我们如何在最后放置一个模板视图,捕获任何未被其前面的模式捕获的URL.一旦我们抓住它,我们将服务index.html在这里我们假设放在您的模板目录中.这index.html应该是您构建React应用程序时生成的.虽然构建的js和css包应该在您的静态文件夹中,但是在运行时应该将它们收集在一起python manage.py collectstatic.像这样的可能的项目架构将是两个项目的两个不同的git存储库,但是你可以使React存储库成为Django存储库的子模块.
单独提供每个应用程序
最后一种方法可能就是你提到的,即将两个应用程序视为单独的项目,并将它们部署为独立的独立项目.这意味着您可以在与Django应用程序不同的服务器或不同端口上提供React应用程序.服务Django在任何服务器上都很直接,通常的做法就是把它放在后面gunicorn.但是对于React,我可以看到两个可能的选项 - 一个是以第一种方式提供它:在本地构建应用程序并将构建文件放入类似的目录中/var/www,让nginx为构建服务.第二种方法是使用生产级流程管理器pm2将React应用程序作为进程提供,而不是由反向代理服务的静态文件.
最终,选择取决于您,除了考虑必须制作的两个应用程序之外还有其他考虑因素 - 例如,您是否正在考虑部署管道?CI/CD?你手动部署?你在部署Docker吗?这些是可能最终影响您决定的各种事情.