Django与React之间的通讯

时间:2018-09-21 08:50:03

标签: django reactjs rest

我正在尝试使用Django作为后端以及React作为前端来设置项目。该项目有几个屏幕,后端中包含许多数据库信息和后端生成的图像,并将包括对不同屏幕的一些身份验证和用户权限。

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

def index(request):
    return render(request, 'frontend/index.html')

引用一个.js文件:

<script src="{% static "frontend/main.js" %}"></script>

使用Webpack创建的。

此main.js使用REST API从Django检索所需的数据:

 fetch("...some Django endpoint..").then(response => ... this.setState(...retrieved data...))

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

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

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

{% for bla in information %}

我想知道这是否是一个合理的设置?

让前端使用REST来检索所需的每条信息,而后端为需要提供的数据的每一部分公开另一个REST api,似乎太过分了(而不是将所有信息都推送到一个单独的dict和连同模板一起发送),

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

3 个答案:

答案 0 :(得分:10)

  

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

我不同意这一行。我会说最好将react应用程序和Django应用程序完全分开。 我相信,Django应用程序应仅提供API和adminsite(也许取决于您的需求)。 前端应该是一个独立的应用程序,可以通过NGINX / ExpressJs / Apache等提供服务。

此设置有几个优点。

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

  1. Django不会为服务前端而负担。使用gunicorn或uwsgi提供Django API。
  2. 由于Django仅通过API提供数据,因此它将使前端应用程序与后端通信的方式更加清晰。我知道您可以在Django提供react应用时使用上下文发送数据,但这可能会由于API和上下文的共存而引起混乱。
  3. 您可以使用Token based authenticationJWT等代替Django自有的session based authentication。{li>

将前端应用程序从后端释放是最好的事情。例如:

  • 如果您有Django服务于前端,则几乎被迫使用基于会话的身份验证(这不像您不能使用其他身份验证,但是拥有多个身份验证系统的意义何在)
  • 您不能在Django渲染前端时使用a lot of other advantages
  • 可以说,您对Django的工作方式一无所知,但由于它为前端服务,因此您将不得不在本地计算机上设置Django应用。
  • 您不能使用ExpressJ来服务前端,也不能使用server side rendering
  • 如果您具有docker设置,则部署会很复杂。在这种情况下,您将不得不使用一个Docker容器来提供所有服务,否则,您可能会使用多个Docker容器来提供后端/前端。
  • 让我们说,您想在一台服务器上提供Django应用程序,而从另一台服务器提供前端服务,但是如果Django与Frontend紧密结合,则无法进行此设置。
  • 您可以轻松连接外部RESTful API服务,而不必担心Django。甚至您也可以使用任何其他框架(如Tornado,Flask等)(但DRF + Django ORM都很棒)来开发API。

还有更多advantages of using NGINX to serve those contents

generic advantages of having backend and frontend separated可供您阅读,有关设置单独的Django + ReactJs应用的信息。

答案 1 :(得分:1)

您可以使用GraphQL,它比REST有很多优点,例如:

  • 整个应用程序只有一个端点;
  • 具有关系之间获取数据的能力;
  • 双方的数据结构轻松修改;
  • 具有缓存/规范化/订阅/乐观更新的高级客户端(我更喜欢使用apollo进行中继);
  • 可用作静态网站生成(SEO)的数据源;
  • 您可以添加其他服务/ API;
  • ...更多。

使用react Server Side Rendering,您可以获取页面而无需其他请求-“预填充” /重新水化,可以进行交互-缩短交互时间。

教程/演示:django-graphql-apollo-react-demo

答案 2 :(得分:0)

您可以使用我编写的框架来设置样板项目,该框架可以立即实现您要寻找的目标。在服务器上使用Django,在客户端上使用React。

https://github.com/rafay826/djudo

react客户端从Django接收API数据,并且身份验证由名为rest-auth的程序包处理。