2013-05-31 106 views
2

我似乎无法让会话工作。 Django抱怨HttpRequest对象没有名为'session'的属性。在文档中明确指出,如果您启用了中间件,并且在已安装的应用程序中安装了django.contrib.sessions,那么您就很好。我使用单元测试得到这个错误。django - HttpRequest对象没有属性'会话'

在我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项目,并在控制台中检查会话属性。这里正是我所做的:

(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) 

回答

1

解决的办法是将它传递给视图函数之前HttpRequest对象上创建会话属性自己。这是因为HttpRequest的工厂不支持中间件在单元测试中,按在了答案:Using session object in Django unit test

9

添加以下到您的测试文件的顶部:

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) 
+3

'django.utils.importlib'已被标记为过时,在Django 1.9中删除。如果您使用的是Django> = 1.9,请改用importlib import import_module'中的: '。 –

0

出于测试目的,可能就足够了只使用一个Mock object产生你需要测试不涉及代码视图或其它隔离部分的行为,你不希望实际测试(如会话中间件) 。

0

当django1.10 - > django1.9。错误:请求对象没有属性“会话”

因为中间件设置已更改。

在1.10设置为:

MIDDLEWARE = [ 
    'django.middleware.security.SecurityMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    xxx 
] 

但1.9的设置是:因为Django的1.7

MIDDLEWARE_CLASSES = [ 
    'django.middleware.security.SecurityMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    xxx 
] 
相关问题