Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Django视图中使用datetime.now()_Python_Django_Datetime_Gunicorn - Fatal编程技术网

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

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

代码

我使用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。现在需要再次计算
,但它似乎不起作用

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上的某个位置