Max*_*rke 4 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
Run Code Online (Sandbox Code Playgroud)
我试图获得的会话值是我试图在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'
>>>
Run Code Online (Sandbox Code Playgroud)
我错过了什么?
更新:这仅在使用单元测试进行测试时才会发生.以下是导致异常的测试:
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)
Run Code Online (Sandbox Code Playgroud)
Mar*_*k L 14
将以下内容添加到测试文件的顶部:
from django.conf import settings
from django.utils.importlib import import_module
Run Code Online (Sandbox Code Playgroud)
那应该工作:
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)
Run Code Online (Sandbox Code Playgroud)
解决方案是在将 HttpRequest 对象传递给视图函数之前自己创建会话属性。这是因为 HttpRequest Factory 不支持单元测试中的中间件,按照以下答案:在 Django 单元测试中使用会话对象
| 归档时间: |
|
| 查看次数: |
7637 次 |
| 最近记录: |