如何在特定时间向用户显示消息Django

时间:2019-09-18 07:51:36

标签: python django django-views

我想知道如何在特定时间使用Django在用户屏幕顶部向用户显示一条简单消息。我一直无法在网上找到与此相关的任何信息,所以我想知道如何去做。

我需要对DateTime做些事情吗?我将代码包含在哪个视图/模型中?

感谢您提供的帮助:)

3 个答案:

答案 0 :(得分:3)

我仍然没有足够的声誉来发表评论:

因此,只要告诉我您“阅读”此答案的时间即可,我将其删除。 如果您愿意,可以将有趣的部分复制/粘贴到评论中。

我认为确切的用例对于给出正确的答案非常重要。这完全取决于您对“确定时间”的确切含义。

  1. 通知时间是预先知道的(javascript警报)
  2. 定期询问Django服务器可以确定何时发送消息(轮询时间长/轮询)
  3. Django服务器需要执行一些后台任务,并且消息应在此任务结束时发送

如果您已经预先知道(当用户打开页面时)应该发生此通知,那么Kostas Charitidis是正确的。 该页面仅可以使用javascript编程计时器,它将是Web浏览器,可以在给定时间向Django请求以获取显示消息。

要在给定的时间将任何东西从Web服务器“推送”到Web浏览器,需要进行连续轮询,长时间轮询,网络套接字之类的东西。

如果预先不知道通知时间,则 例如,一种轮询方法将使用一段javascript,该javascript会定期(每隔几秒/分钟/取决于您的使用情况)查询Django服务器是否应提取一条消息。

长轮询是一种方法,其中Web浏览器向服务器执行获取请求,然后服务器暂停答案直到应发送消息为止。 (如果请求超时,将启动新的轮询请求) 但是,要(有效地)使用长轮询,您需要在服务器端使用一些特殊的插件以使其高效/资源友好。

如果不需要从某些旧的公司(或偏执狂)防火墙后面访问您的网站,则可以考虑使用Web套接字(但是仍然有一些公共服务/大公司在阻止Web套接字)

django-channels(https://pypi.org/project/channels/)可以帮助您进行Web套接字通知和一些后台任务

celery(https://pypi.org/project/celery/)可以帮助您运行定期/延迟/任务,但不包含将消息发送到浏览器的方法。 芹菜是最推荐的解决方案之一,但是(我认为)设置起来很痛苦。

根据项目的不同,一些更轻巧的东西(例如django-background-tasks https://pypi.org/project/django-background-tasks/)可以完成工作

您可能会看到django消息框架(https://docs.djangoproject.com/en/2.2/ref/contrib/messages/)。但这很可能不是您所处环境的正确答案。

答案 1 :(得分:0)

您不需要任何模型即可做到

选项1

使用ajax(当您要在特定间隔刷新特定时间时使用)

只需创建一个视图,

import datetime
from django.http import JsonResponse


def get_certain_date(request):
   # or get certain date from database or somewhere else.
   return JsonResponse({'certain_date':datetime.datetime.now()})

并使用ajax调用来更新html内容。

选项2 (在您不想更新特定时间直到用户刷新页面时使用)

在Django视图中渲染特定时间。

from django.shortcuts import render

def home(request): 
    render(request, "html.html", {'certain_time': certain_time})  #  get it from database.

答案 2 :(得分:0)

您完全可以使用前端Javascript来实现。完全不需要Django代码。但是,这取决于您打算做什么。

<p id="demo" ></p>
<script>
var today = new Date();
var date = today.getFullYear()+'-'+(today.getMonth()+1)+'-'+today.getDate();
var time = today.getHours() + ":" + today.getMinutes() + ":" + today.getSeconds();
var dateTime = date+' '+time;
if (today.getHours() >= 1){
  document.getElementById("demo").innerHTML = "Insert your message here!!";
}
else {
  document.getElementById("demo").innerHTML = "We don't want you to know the message yet";

}
</script>

如果用户加载页面的时间超过当天的凌晨1点(我给出的用于测试的时间),则显示“在此处插入您的消息!”。如果尚未到该时间,则显示“我们不希望您知道该消息”。

在if语句中插入您选择的小时,并将您选择的消息设置为innerHTML

或者,您可以使用Javascript显示或隐藏元素。您可以为此使用类似的东西。

  if (if (today.getHours() >= 1)) {
    document.getElementById("demo").style.display = "block";
  } else {
    document.getElementById("demo").style.display = "none";
  }

对于(由Nishant提出的)您需要服务器时间而不是用户时间的情况,您将从datetime.datetime.now()中获得小时,然后将其作为变量传递(比如说curr_date_hour ),然后将其替换为Java脚本if语句:

  if (if (today.getHours() >= {{curr_date_hour}})) {
    document.getElementById("demo").style.display = "block";
  } else {
    document.getElementById("demo").style.display = "none";
  }