django - HttpRequest对象没有属性'session'

时间:2013-05-31 21:02:54

标签: django session httprequest django-unittest

我似乎无法让会话有效。 Django抱怨HttpRequest对象没有名为'session'的属性。在文档中,它清楚地表明,如果您启用了中间件,并且已安装的应用程序中包含django.contrib.sessions,那么您就可以开始了。我使用单元测试得到了这个错误。

在我的views.py中:

def home_page(request):
    response = render(request, 'home.html', {'message_text' : request.session.get('message_text', ''),
'ip_address'    :   request.session.get('ip_address', ''),
'port_number'   :   request.session.get('port_number', ''),
'command_text'  :   request.session.get('command_text', ''),})

    request.session['message_text'] = ''

    return response

我想要获得的会话值是我尝试在views.py中其他地方的表单post方法中设置的。

它还声明默认情况下会在新项目中启用这些功能。所以我创建了一个全新的django项目并在控制台中检查了session属性。这正是我所做的:

(django1.5)Python $ django-admin.py startproject testing
(django1.5)Python $ cd testing/
(django1.5)testing $ python manage.py shell
Python 2.7.3 (v2.7.3:70274d53c1dd, Apr  9 2012, 20:52:43) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from django.http import HttpRequest
>>> r = HttpRequest()
>>> r.session
Traceback (most recent call last):
  File "<console>", line 1, in <module>
AttributeError: 'HttpRequest' object has no attribute 'session'
>>>

我错过了什么?

更新:仅在使用单元测试进行测试时才会发生这种情况。以下是导致异常的测试:

def test_home_page_returns_correct_html(self):
        request = HttpRequest()
        response = home_page(request)
        expected_html = render_to_string('home.html')
        self.assertEqual(response.content, expected_html)

3 个答案:

答案 0 :(得分:13)

将以下内容添加到测试文件的顶部:

from django.conf import settings
from django.utils.importlib import import_module

然后这应该有效:

def test_home_page_returns_correct_html(self):
    request = HttpRequest()
    engine = import_module(settings.SESSION_ENGINE)
    session_key = None
    request.session = engine.SessionStore(session_key)
    response = home_page(request)
    expected_html = render_to_string('home.html')
    self.assertEqual(response.content, expected_html)

答案 1 :(得分:1)

解决方案是在将HttpRequest对象传递给view函数之前自己创建会话属性。这是因为HttpRequest Factory在单元测试中不支持中间件,根据以下答案:Using session object in Django unit test

答案 2 :(得分:0)

出于测试目的,只需使用Mock object即可生成测试视图或其他独立部分所需的行为而不涉及您不想实际测试的代码(如会话中间件) 。