【问题标题】:How can i update a django template in real time?如何实时更新 django 模板?
【发布时间】:2019-11-10 08:05:21
【问题描述】:

在这个模板中,我从 API 中检索比特币的价格。在实际情况下,价格只会在页面刷新时更新,而我希望它在动态刷新整个页面的情况下更新。

这是我的看法:

def home(request):

    symbol = "BTCUSDT"
    tst = client.get_ticker(symbol=symbol)

    test = tst['lastPrice']

    context={"test":test}

    return render(request,
                  "main/home.html", context
                  )

模板的行看起来像这样:

<h3> var: {{test}} </h3> 

这里有两个问题:

1) 据我所知,Django 本身不是异步的,所以我需要找到一种方法来实时更新模板的那部分,而不必刷新整个页面。

2) 实际上,在打开/刷新页面时请求 API,但要流式传输价格,它应该 始终 运行。我尝试了这个(糟糕的)解决方案:在视图中添加 while true,但它当然破坏了我的代码,只执行了 while 语句的一部分。

感谢任何建议:)

【问题讨论】:

  • 在这种情况下,您应该编写一些 JavaScript 来调用 API 并获取新价格。例如角度。 Django 是一个后端,而不是一个前端
  • 要么你想要通过 jQuery 进行 AJAX,工作在后端完成,要么尝试单独通过 JS 更新值。这是相当广泛的
  • 是的,但本质上,问题是我不明白将不断查询 api 的代码放在哪里。我的意思是,如果我把它放到视图中,它将不起作用
  • 为什么它在视图中不起作用?它现在工作正常。关键是,您的 Ajax 会重复调用视图并根据需要更新前端。

标签: python django django-templates django-views


【解决方案1】:

您应该将前端和后端分开,以便动态更新 DOM 内容,而无需每次都渲染整个 DOM。

当用户执行需要刷新或获取更新数据的操作时,前端的职责是请求和获取最新值。请求需要通过例如异步进行阿贾克斯。较新的 JS 框架,例如React、Vue 使用虚拟 DOM,它们使用中间虚拟 DOM 来推送更新并最终一次性更新真实 DOM;这使它们非常高效。

(Django) 后端应该公开一个 API,该 API 会从后端获取特定资源的 (AJAX) 请求,并为它们提供服务。

一个不错的 Django 框架是 DRF(Django REST 框架),它公开了 REST 端点,您可以通过 AJAX 从前端调用这些端点并获得响应,以便前端可以进行必要的更新。

这是一个失败的高级视图,旨在为您提供一个可以通过深入挖掘来实现的想法。

【讨论】:

  • 还有一件事@heemayl:你说'当用户做某事时它需要刷新',但在这种情况下,用户不会做任何事情。我的意思是,页面只需实时更新,无需任何输入;只是查看页面。那是一样的吗?我还应该选择 DRF 吗?
  • @Jack022 是的。我的意思是它将是基于事件的。该事件将是一个前端事件,例如用户点击某些东西,经过了一段时间,一些外部输入等等。然后前端将向后端发送 AJAX 请求以获取新数据,DRF 将提供所请求的数据。如您所见,DRF 只提供请求的内容,前端需要执行请求。
  • 好的,但我的意思是,在这种情况下,用户不应该输入。我正在寻找的是,用户打开页面,他将看到页面的一部分,其中数字实时更新。抱歉,但我对这些东西不熟悉 :)
  • @Jack022 是的。你可以这样做。我建议你开始阅读 AJAX 的基础知识 :)
  • 谢谢@heemayl。真的是最后一件事。使用此解决方案或使用 Django-Channels 更新页面或类似 SocketIO 有什么区别?
猜你喜欢
  • 2019-11-16
  • 2012-12-19
  • 1970-01-01
  • 2019-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-07
  • 1970-01-01
相关资源
最近更新 更多