加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

Django和React之间的通信

发布时间:2020-12-20 12:14:37 所属栏目:Python 来源:网络整理
导读:我正在尝试使用Django作为后端和React作为前端来设置项目.该项目有几个屏幕,DB中的大量信息和后端生成的图像,并将包括一些身份验证和不同屏幕的用户权限. 根据我发现 – 最好的方法是让Django渲染一个html文件: def index(request): return render(request,
我正在尝试使用Django作为后端和React作为前端来设置项目.该项目有几个屏幕,DB中的大量信息和后端生成的图像,并将包括一些身份验证和不同屏幕的用户权限.

根据我发现 – 最好的方法是让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来呈现整页(我猜通常是可以的)

解决方法

According to what I found – the best way to do it is having Django render an html file:

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

这种设置有几个优点.

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

> Django不会为前端服务负担.使用gunicorn或uwsgi来提供Django API.
>由于Django将仅通过API提供数据,因此它将清楚地说明前端应用程序如何与后端通信.我知道当Django为react应用程序提供服务时,您可以使用上下文发送数据,但由于API和上下文的共存,这可能会导致混淆.
>您可以使用Token based authentication,JWT等代替Django自己的session based authentication,它们有a lot of other advantages.

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

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

还有一些generic advantages of having backend and frontend separated.

有关于设置单独的Django ReactJs应用程序的介质,您可以阅读a fantastic tutorial.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读