KeyError говорит о том, что ключ (партнер) не в поле зрения? - PullRequest
4 голосов
/ 25 мая 2010

Я пытаюсь создать приложение для чата, используя python и django. Я почти завершаю его, и он работает нормально в течение 8-10 минут, когда два человека в чате после определенного времени показывают ошибку.

вот трассировка: -

Traceback (most recent call last):

  File "\Django_chat\django_chat\chat\views.py", line 55, in receive

    message = chatSession.getMessage(request.session['partner'],request.session['uid'],afterTime)

  File "C:\Python26\lib\site-packages\django\contrib\sessions\backends\base.py", line 47, in __getitem__

    return self._session[key]

KeyError: 'partner'

вот модуль приема: -

def receive(request):
    # message received by this user
    chatSession = chat()
    data = request.POST
    afterTime = data['lastMsgTime']
    try:
        message = chatSession.getMessage(
            request.session['partner'],
            request.session['uid'],
            afterTime)
    except:
        #partnerId = virtual_users.objects.get(id=request.session['uid']).partner
        print('there is an error in receive request')
        traceback.print_exc(file=open("/myapp.log","a"))
    msg = serializers.serialize("json", message)
    return HttpResponse(msg)

Пожалуйста, помогите мне :( Спасибо Ansh J

Ответы [ 2 ]

3 голосов
/ 25 мая 2010

Я предполагаю, что время сеанса пользователя истекло, и, следовательно, request.session не содержит значений partner или uid.

Время сессий истекает из-за (отсутствия) активности на них. Чтение сеанса не считается активностью по истечении срока действия. Срок действия сеанса вычисляется с момента последнего изменения сеанса. По умолчанию Django сохраняет данные в базе данных сеанса только после того, как сеанс был изменен, то есть если какое-либо из его значений словаря было назначено или удалено. Чтобы изменить это поведение по умолчанию, установите для параметра SESSION_SAVE_EVERY_REQUEST значение True. Если SESSION_SAVE_EVERY_REQUEST равно True, Django будет сохранять сеанс в базе данных при каждом отдельном запросе.

0 голосов
/ 25 мая 2010

Попробуйте

print 'request.session contains ', repr(request.session)

в вашем except номере. В словаре отсутствует что-либо, кроме элемента с 'partner' в качестве ключа? Это пусто? Как бы то ни было, постарайтесь понять, как / почему это стало так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...