在Django视图中使用datetime.now()

时间:2016-10-05 03:58:28

标签: 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 = 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.now,但它似乎不起作用。

def get_now():
    return timezone.now())

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

我已经看到了一些在视图中使用datetime.now()的例子,但没有遇到这个问题。

我怀疑我在开发过程中从未见过这个,因为我使用--reload选项运行开发gunicorn服务器,并且在保存更改并重新启动服务器时会不断评估datetime.now()

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

上下文

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

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

1 个答案:

答案 0 :(得分:0)

  

每次调用视图时,该值都不会更新   在第二天到来时错误的数据被过滤

你必须决定你在谈论哪个“第二天”?是吗:

  1. 访问您网站的用户的第二天。
  2. 第二天为您访问该网站。
  3. 服务器上设置的时区的第二天。
  4. 这些中的每一个都会以“错误”的结果结束,而事实上代码实际上没有任何错误。

    这是因为你的代码在时区方面很幼稚。它基本上完全忽略了时区。

    这是一个复杂的话题,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)