我的代码非常简单,它会查询数据库以获取未来事件的列表。
now = datetime.datetime.now(pytz.utc)
def index(request, listing='upcoming'):
country_name = get_client_ip(request)
if Location.objects.filter(country=country_name).count() == 0:
global_scope = True
else:
global_scope = False
if listing == 'upcoming':
if global_scope == True:
events = Event.objects.filter(date__gte=now, published=True)
else:
events = Event.objects.filter(date__gte=now, published=True, location__country=country_name)
elif listing == 'new':
if global_scope == True:
events = Event.objects.filter(published=True).order_by('-added')
else:
events = Event.objects.filter(published=True, location__country=country_name).order_by('-added')
elif listing == 'free':
if global_scope:
events = Event.objects.filter(date__gte=now, published=True, price__isnull=True)
else:
events = Event.objects.filter(date__gte=now, published=True, price__isnull=True, location__country=country_name)
elif listing == 'wishlist':
events = Event.objects.filter(users = request.user.id, published=True)
else:
events = Event.objects.filter(date__gte=now, published=True)
paginator = Paginator(events, 10)
page = request.GET.get('page')
try:
events = paginator.page(page)
except PageNotAnInteger:
events = paginator.page(1)
except EmptyPage:
events = paginator.page(paginator.num_pages)
return render(request, 'events/index.html', { "events": events, 'listing': listing, 'country_name': country_name, })
这里的问题是,由于某种原因,该网站会在星期一开始显示事件,直到我在星期五用一些事件更新数据库。
该网站在postgres上运行,并使用django 1.6。我查了一下,看起来好像在设置 default_transaction_isolation:' read committed'会解决它。但是阅读postgres的文档我发现它是默认的。
关于如何跟踪造成这种情况的原因的任何想法?
答案 0 :(得分:0)
因此,出于某种原因,now
的定义在函数之外,在模块级别。这意味着它只在进程启动时执行,并且相同的值将用于该进程中的所有请求。您的Web服务器管理其流程,它们可以持续数天或数周才能被回收。
只需将该行移动到函数本身,每次调用函数时它都会得到一个新值。
(如果要定义 在请求中是静态的数据,则定义函数外部的值是一种非常好的技术,但这不是这种情况。)