使用日期时间。现在()在Django vi

2024-06-16 11:51:57 发布

您现在位置:Python中文网/ 问答频道 /正文

代码

我正在使用日期时间。现在()作为Django视图中筛选器的一部分,如下所示:

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()来过滤旧的公告,但是在生产环境中一天后,我意识到{}只在服务器启动时被评估,并且每次调用视图时值都不会更新,这会导致在第二天到来时过滤错误的数据。这也影响了另一个函数,该函数检索未来7天内即将到来的生日。在

我阅读和尝试的东西

我看到了很多关于使用可调用的datetime.now而不是datetime.now()的问题,但仅限于在模型中设置默认值的上下文中。在

我定义了一个函数如下,认为它会强制datetime.now再次求值,但它似乎不起作用。在

^{pr2}$

当我通过访问上下文的日期来查看我得到的内容时,我发现日期和时间不会超过部署服务器的时间。在

我见过很多使用日期时间。现在()在视图中,但没有一个遇到此问题。在

我怀疑我从未在开发中看到过这一点,因为我使用--reload选项运行development gunicorn服务器,并且在保存更改和服务器重新启动时,datetime.now()会不断求值。在

This problem似乎很相似,但我不确定它与我的情况有何相似/不同

上下文:

我正在编写一个Django应用程序,我的开发和生产环境是使用docker实现的,应用程序运行在nginx代理之后

/usr/local/bin/gunicorn app.wsgi:application -w 2 -b :8000

Tags: 服务器视图getdatetimedatecontext时间publish
1条回答
网友
1楼 · 发布于 2024-06-16 11:51:57

the value does not update each time the view is called which results in the wrong data being filtered when the next day comes around

你得决定你说的是哪一天?是不是:

  1. 第二天用户访问你的网站。在
  2. 第二天对你来说,访问网站。在
  3. 在服务器上设置的时区的第二天。在

每一个结果都会导致一个“错误”的结果,而实际上代码实际上没有什么错误。在

这是因为当涉及时区时,您的代码很幼稚。它基本上完全忽略了时区。在

这是一个复杂的主题,django有一个专门处理时区的complete section of the manual。我建议你读一两遍,因为时区会影响你的网站。在

最后,您可以稍微清理一下代码,如下所示:

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)

相关问题 更多 >