我想知道如何在特定时间使用Django在用户屏幕顶部向用户显示一条简单消息。我一直无法在网上找到与此相关的任何信息,所以我想知道如何去做。
我需要对DateTime做些事情吗?我将代码包含在哪个视图/模型中?
感谢您提供的帮助:)
答案 0 :(得分:3)
我仍然没有足够的声誉来发表评论:
因此,只要告诉我您“阅读”此答案的时间即可,我将其删除。 如果您愿意,可以将有趣的部分复制/粘贴到评论中。
我认为确切的用例对于给出正确的答案非常重要。这完全取决于您对“确定时间”的确切含义。
如果您已经预先知道(当用户打开页面时)应该发生此通知,那么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";
}