繁体   English   中英

Django或PostgreSQL的缓存问题

[英]Caching issues with django or postgresql

我的问题是我的生产服务器显示的查询结果不正确(创建和删除已正确说明,但没有更新会影响结果的现有字段)。 我认为这是一个日期比较问题,并花了几个小时进行调试,因为我无法在开发人员上重现该错误。 最终,我重新启动了gunicorn,问题消失了。 似乎是postgresql或django正在缓存queryset结果。 我尚未设置缓存,所以不明白为什么会这样。

我有两个问题:

  1. 谁在缓存?
  2. 如何禁用它? -我需要每次调用set时都要对其进行评估

设定

Python 2.7

的Django 1.7

PostgreSQL的

的Ubuntu

views.py提取

class EventList(ListView, FilterMixin):
    model = Listing
    queryset = Listing.events.order_by('-from_date', )

models.py提取

class Listing(models.Model):
    title = models.CharField(max_length=200, null=True)
    to_date = models.DateTimeField(null=True, blank=True)
    from_date = models.DateTimeField(null=True, blank=True)
    events = EventManager()
    event = models.ForeignKey('Event', related_name='listings', null=True, blank=True, on_delete=models.SET_NULL)

class EventManager(models.Manager):
    def get_queryset(self):
        now = arrow.now()
        # Only listings which have events ending after today
        qry = super(EventManager, self).get_queryset().filter(event__isnull=False).select_related('event').filter(to_date__gte=now.datetime)
        return qry

这似乎是一个导入时间评估问题(在某种程度上,它是您所说的日期比较问题)。

一旦导入了views.py模块,将对EventList类的queryset成员进行评估。 结果是一个QuerySet 实例 ,该实例已在导入时计算。 因此.filter(to_date__gte=now.datetime)部分实际上是在那时执行的,因此日期实际上总是相同的(导入时的日期)。

调用视图时,所有django在幕后所做的就是将.all()附加到queryset,以强制对查询进行新的评估。 但是由于datetime过滤器实际上是在加载模块时评估的,因此它将始终按同一日期过滤。 例如,如果您插入日期重新启动服务器之前的新列表,我希望您得到这些新结果!

对于需要动态过滤的此类情况,应改用ListPageView.get_queryset方法来强制执行运行时评估:

class EventList(ListView, FilterMixin):
   def get_queryset(self):
      return Listing.events.order_by('-from_date')

如果您尚未添加任何缓存层,则Django不可能进行缓存。 在Django中,它并不是开箱即用的。 您必须在其他地方寻找问题的根本原因。 使用给出的部分代码,无法推测出可能的原因。

尝试找出开发服务器与生产服务器之间的差异,只有这样才能为您提供查明问题的初步线索。

  1. 生产服务器是否位于不同的时区?

  2. 产品和开发人员的环境以及环境变量有什么区别?

  3. gunicorn重新启动有什么变化?

  4. 如果错误再次在生产中浮出水面,则需要多长时间才能重新出现。 您是否可以使用logstash和kibana之类的工具在生产中添加日志事件。

  5. Python语言具有日期时间处理的一些非直观方面。 您可以阅读更多有关它的信息,在这里。 -https : //opensourcehacker.com/2008/06/30/relativity-of-time-shortcomings-in-python-datetime-and-workaround/,Python日期函数错误

这些是可以用来找出根本原因的通用策略。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM