Django会话不适用于Heroku

时间:2016-05-01 05:49:00

标签: django session heroku

我已经根据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中添加一些内容吗?因为没有实际错误,我感到很茫然。它只是无声地失败......

谢谢!

1 个答案:

答案 0 :(得分:3)

您在SESSION_ENGINE中使用了哪种settings.py?在Heroku上,Dynos一直重启,应该被视为短暂的资源。

要解决此问题,您应该使用SESSION_ENGINE= 'django.contrib.sessions.backends.cached_db'。这将确保您的会话数据在Heroku上持久保存到您的数据库(您正在使用Heroku Postgres,对吗?)