2016-05-01 3 views
2

Я написал простое приложение для голосования, основанное на учебнике Django. Я хочу ограничить количество голосов на одного посетителя, поэтому я использовал сеансы промежуточного программного обеспечения Django. Я совершенно не знаком с сессиями, но мне удалось получить что-то, что работает на моей локальной машине. К сожалению, как только я подтолкнул его к Хереку, он прекратил работать. Я видел несколько других SO статей относительно этого вопроса, когда у вас есть несколько динамометрических стендов, но я на Hobby счете только 1 дин, так что ...Django Session не работает на Heroku

Вот логика в моем 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

SESSION_ENGINE Вы используете в своем settings.py? На Heroku Dynos все время перезагружается, и его следует рассматривать как эфемерные ресурсы.

Для борьбы с этим вам следует, вероятно, использовать SESSION_ENGINE= 'django.contrib.sessions.backends.cached_db'. Это обеспечит сохранение ваших данных сеанса в вашей базе данных на Heroku (вы используете Heroku Postgres, верно?)

+0

Спасибо! Я использую Heroku Postgres. Я вообще не настроил SESSION_ENGINE. Я предположил, что дефолт будет в порядке. Я добавил вышеприведенную строку, и теперь она работает. В документации упоминается настройка CACHES, но я не был полностью уверен, как ее настроить. Это необходимо? Кроме того, есть ли хороший способ проверить, чтобы при перезапуске диноза сеанса все еще сохранялись? – knittingarch

+0

Heyo! Таким образом, вы также захотите установить свои настройки кэширования, а также =) Чтение через документы даст вам представление о том, что использовать на основе какой настройки у вас есть. Если вы хотите протестировать свои сеансы прямо сейчас, вы можете начать сеанс, а затем сказать «heroku ps: restart», чтобы заставить ваши динамики перезагрузиться, после чего вы можете сделать другой запрос. – rdegges

+0

Отлично! Большое спасибо за Вашу помощь. – knittingarch

Смежные вопросы