Django和React之间的通信

use*_*014 4 django rest reactjs

我正在尝试使用Django作为后端和React作为前端来设置项目.该项目有几个屏幕,DB中的大量信息和后端生成的图像,并将包括一些身份验证和不同屏幕的用户权限.

根据我发现 - 最好的方法是让Django渲染一个html文件:

def index(request):
    return render(request, 'frontend/index.html')
Run Code Online (Sandbox Code Playgroud)

它引用了一个.js文件:

<script src="{% static "frontend/main.js" %}"></script>
Run Code Online (Sandbox Code Playgroud)

这是使用Webpack创建的.

这个main.js使用REST api从Django中检索所需的数据:

 fetch("...some Django endpoint..").then(response => ... this.setState(...retrieved data...))
Run Code Online (Sandbox Code Playgroud)

与仅使用Django for backend + Django模板的前端不同,后端可以直接将上下文发送到模板:

def index(request):
    context = {'information': .... retrieve info from DB}
    return HttpResponse(loader.get_template('bla/index.html').render(context, request))
Run Code Online (Sandbox Code Playgroud)

模板可以直接使用此信息,而无需再次引用后端:

{% for bla in information %}
Run Code Online (Sandbox Code Playgroud)

我想知道这是否合理?

让前端使用REST来检索它需要的每条信息并且后端为它需要提供的每个数据部分暴露另一个REST api似乎过分(而不是仅仅将所有信息推送到单个dict并将其发送到以及模板),

此外,它需要至少2个RTT来呈现整页(我猜通常是可以的)

rud*_*dra 12

根据我发现 - 最好的方法是让Django渲染一个html文件:

我不同意这一行.我想说最好保持react应用程序和Django应用程序完全分开.我相信,Django应用程序应该只提供API和管理站点(可能,根据您的需要).前端应该是一个独立的应用程序,可以通过NGINX/ExpressJs/Apache等提供服务.

这种设置有几个优点.

从Django应用程序的角度来看,优点是:

  1. Django不会为前端服务负担.使用gunicorn或uwsgi来提供Django API.
  2. 由于Django将仅通过API提供数据,因此它将清楚地说明前端应用程序如何与后端通信.我知道当Django为react应用程序提供服务时,您可以使用上下文发送数据,但由于API和上下文的共存,这可能会导致混淆.
  3. 您可以使用基于令牌的身份验证,JWT等代替Django自己的基于会话的身份验证,这具有许多其他优势.

从后端释放前端应用程序是前端可能发生的最好的事情.例如:

  • 如果你让Django服务于前端,你几乎被迫使用基于会话的身份验证(它不像你不能使用其他身份验证,但最重要的是拥有多个身份验证系统)
  • 您无法使用Django渲染前端的服务器端渲染.
  • 可以说,你不知道Django是如何工作的,但是你将被迫在你的本地机器上设置一个Django应用程序,因为它服务于前端.
  • 您不能使用ExpressJ来服务前端,或者使用NGINX来提供这些内容优势.
  • 如果您有docker设置,部署会很复杂.在这种情况下,您将不得不使用一个Docker容器来提供所有服务,否则您可能已经使用多个docker容器来提供后端/前端.
  • 可以说,你想在一台服务器上提供Django应用程序,从其他服务器前端,但是Django与前端紧密结合,你无法进行这种设置.
  • 您可以轻松连接外部RESTful API服务,而无需担心Django.即使您可以使用任何其他框架,如Tornado,Flask等(但DRF + Django ORM非常棒)来开发API.

将后端和前端分开有一些更通用的优点.

一个很棒的教程,你可以在媒体上阅读有关设置单独的Django + ReactJs应用程序.