Python 在Django视图中使用datetime.now()
代码 我使用datetime.now()作为Django视图中筛选器的一部分,如下所示:Python 在Django视图中使用datetime.now(),python,django,datetime,gunicorn,Python,Django,Datetime,Gunicorn,代码 我使用datetime.now()作为Django视图中筛选器的一部分,如下所示: def get_now(): return timezone.now() class BulletinListView(ListView): model = Announcement template_name = 'newswire/home.html' def get_context_data(self, **kwargs): context = su
def get_now():
return timezone.now()
class BulletinListView(ListView):
model = Announcement
template_name = 'newswire/home.html'
def get_context_data(self, **kwargs):
context = super(BulletinListView, self).get_context_data(**kwargs)
try:
published_announcements = Announcement.objects.filter(publish_start_date__lte=get_now(), publish_end_date__gte=get_now()).filter(hidden=False, under_review=False).extra(order_by=['-publish_start_date', 'publish_end_date'])
except Announcement.DoesNotExist:
published_announcements = None
if published_announcements is not None:
context['announcements'] = published_announcements
max_print_annoucements = int(config.MAX_PRINT_ANNOUCEMENTS)
context['announcements_print'] = published_announcements[
:max_print_annoucements]
context['more_annoucements_online_count'] = published_announcements.count() - max_print_annoucements
return context
编辑:管理更新并包含更多代码
根据datetime.now()提供的日期,它可以正常工作,并获取应该发布的、未隐藏或正在审查的公告
问题
我使用datetime.datetime.now()
来过滤旧的公告,但在生产环境中工作一天后,我意识到datetime.datetime.now()
仅在服务器启动时进行评估,并且该值不会在每次调用视图时更新,这会导致在第二天出现时过滤错误数据。这也影响到另一个函数,该函数检索未来7天内即将到来的生日
我读过并尝试过的东西
关于使用可调用的datetime.now
而不是datetime.now()
,我已经看到了一些问题,但仅限于在模型中设置默认值的上下文中
我定义了一个函数,如下所示,我认为它将强制datetime。现在需要再次计算,但它似乎不起作用
def get_now():
return timezone.now())
当我传递到达上下文以查看我得到的内容的日期时,我看到日期和时间不会超过部署服务器的时间
我在视图中看到了许多使用datetime.now()的示例,但没有一个遇到这个问题
我想我在开发中从未见过这种情况,因为我使用--reload选项运行开发gunicorn服务器,并且datetime.now()
在保存更改和服务器重新启动时不断进行评估
看起来很相似,但我不确定这与我的情况有什么相似/不同
上下文:
我正在编写一个Django应用程序,我的开发和生产环境是使用docker实现的,应用程序运行在nginx代理之后
/usr/local/bin/gunicorn app.wsgi:application -w 2 -b :8000
该值不会在每次调用视图时更新,从而导致
在第二天到来时过滤错误的数据
你必须决定你说的是哪一天?是:
用户访问您的站点的第二天
第二天,您将访问该网站
服务器上设置的时区的第二天
其中的每一个都将以“错误”的结果结束,而实际上代码并没有任何问题
这是因为当涉及时区时,您的代码是幼稚的。它基本上完全忽略了时区
这是一个复杂的话题,django有一个专门处理时区的方法。我建议你读一两遍,因为时区会影响你的网站
最后,您可以稍微清理一下代码,如下所示:
try:
max_print_annoucements = int(config.MAX_PRINT_ANNOUCEMENTS)
except ValueError:
max_print_announcements = 0
published_announcements = Announcement.objects.filter(publish_start_date__lte=get_now(),
publish_end_date__gte=get_now())
.filter(hidden=False, under_review=False)
.extra(order_by=['-publish_start_date',
'publish_end_date'])
context['announcements'] = published_announcements
context['announcements_print'] = published_announcements[:max_print_annoucements]
context['more_annoucements_online_count'] = abs(published_announcements.count() - max_print_annoucements)
该值不会在每次调用视图时更新,从而导致
在第二天到来时过滤错误的数据
你必须决定你说的是哪一天?是:
用户访问您的站点的第二天
第二天,您将访问该网站
服务器上设置的时区的第二天
其中的每一个都将以“错误”的结果结束,而实际上代码并没有任何问题
这是因为当涉及时区时,您的代码是幼稚的。它基本上完全忽略了时区
这是一个复杂的话题,django有一个专门处理时区的方法。我建议你读一两遍,因为时区会影响你的网站
最后,您可以稍微清理一下代码,如下所示:
try:
max_print_annoucements = int(config.MAX_PRINT_ANNOUCEMENTS)
except ValueError:
max_print_announcements = 0
published_announcements = Announcement.objects.filter(publish_start_date__lte=get_now(),
publish_end_date__gte=get_now())
.filter(hidden=False, under_review=False)
.extra(order_by=['-publish_start_date',
'publish_end_date'])
context['announcements'] = published_announcements
context['announcements_print'] = published_announcements[:max_print_annoucements]
context['more_annoucements_online_count'] = abs(published_announcements.count() - max_print_annoucements)
但在生产环境中工作了一天后,我意识到只有在服务器启动时才会计算datetime.datetime.now(),并且每次调用视图时该值都不会更新。您可能有一个混乱的缓存设置作为旁白,可能处理跨时区请求的服务器应该通过datetime.utcnow()
@e4c5使用通用时间。我将再次检查堆栈是否有任何缓存,但从Django设置文件中,我没有定义任何缓存。@tdelaney感谢您指出这一点,在为我的问题寻找答案之后,我也意识到了这一点,我希望改变现状。我最终会使用datetime.utcnow()
,顺便说一句,我正在另一个时区进行这个项目!所以时区对我来说是真实的。我正在慢慢地弄明白,第一个Django项目!第一个有真实用户反馈的真实世界应用程序。尝试在不同的浏览器中打开(我建议使用匿名模式),看看是否会得到不同的结果。视图应该有效。它可以缓存在浏览器上,也可以缓存在中间网络硬件上。”但我在生产环境中工作了一天后意识到,只有在服务器启动时才会计算datetime.datetime.now(),并且该值不会在每次调用视图“not so”时更新。您可能有一个混乱的缓存设置作为旁白,可能处理跨时区请求的服务器应该通过datetime.utcnow()
@e4c5使用通用时间。我将再次检查堆栈是否有任何缓存,但从Django设置文件中,我没有定义任何缓存。@tdelaney感谢您指出这一点,在为我的问题寻找答案之后,我也意识到了这一点,我希望改变现状。我最终会使用datetime.utcnow()
,顺便说一句,我正在另一个时区进行这个项目!所以时区对我来说是真实的。我正在慢慢地弄明白,第一个Django项目!第一个有真实用户反馈的真实世界应用程序。尝试在不同的浏览器中打开(我建议使用匿名模式),看看是否会得到不同的结果。视图应该有效。它可以缓存在浏览器上或Internet上的某个位置