我已经根据Django教程编写了一个简单的投票应用程序。我想将每个访问者的投票数限制为一个,所以我使用了Django的中间件会话。我对会话来说是全新的,但我能够在本地计算机上运行。不幸的是,一旦我把它推到Heroku,它就停止了工作。当你有多个dynos时,我看到了一些关于这个问题的其他SO文章,但我只是一个dyno的Hobby帐户,所以......
这是我的views.py中的逻辑:
def vote(request, question_id):
question = get_object_or_404(Question, pk=question_id)
if request.session.get('has_voted', False):
return render(request, 'poll/detail.html', {
'question': question,
'error_message': ("You've already voted."),
})
try:
selected_choice = question.choice_set.get(pk=request.POST['choice'])
except (KeyError, Choice.DoesNotExist):
return render(request, 'poll/detail.html', {
'question': question,
'error_message': "Make sure to select a choice.",
})
else:
selected_choice.votes += 1
selected_choice.save()
request.session['has_voted'] = True
return HttpResponseRedirect(reverse('results', args=(question.id,)))
会话逻辑几乎逐字地来自documentation,我的settings.py已正确配置。我错过了Heroku的特殊配置吗?我需要在settings.py中添加一些内容吗?因为没有实际错误,我感到很茫然。它只是无声地失败......
谢谢!
答案 0 :(得分:3)
您在SESSION_ENGINE
中使用了哪种settings.py
?在Heroku上,Dynos一直重启,应该被视为短暂的资源。
要解决此问题,您应该使用SESSION_ENGINE= 'django.contrib.sessions.backends.cached_db'
。这将确保您的会话数据在Heroku上持久保存到您的数据库(您正在使用Heroku Postgres,对吗?)