KeyError:这表示字典中没有键(partner)吗?

4 投票
2 回答
920 浏览
提问于 2025-04-15 23:07

我正在用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 个回答

0

试试这个:

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

把这行代码放在你的 except 代码块里。看看这个字典里除了键为 'partner' 的项,还有没有其他东西?它是空的吗?无论如何,想想看它为什么会变成这样。

3

我猜用户的会话超时了,所以request.session里面没有partneruid的值。

会话超时是根据用户在会话中的活动情况来决定的。如果只是查看会话内容,这并不算是活动,所以不会影响会话的过期时间。会话过期是从上次修改会话的时间开始计算的。默认情况下,Django只有在会话被修改时才会把数据保存到会话数据库里,也就是说,只有当会话中的某些值被添加或删除时,才会保存。如果你想改变这个默认设置,可以把SESSION_SAVE_EVERY_REQUEST设置为True。如果SESSION_SAVE_EVERY_REQUEST为True,Django会在每次请求时都把会话保存到数据库里。

撰写回答