【问题标题】:Django Testing - access session in RequestFactoryDjango 测试 - RequestFactory 中的访问会话
【发布时间】:2016-10-09 18:52:49
【问题描述】:

我在 Django 测试中使用RequestFactory,但我找不到访问会话变量的正确方法,当我尝试时出现以下错误 self.factory._session["zip_id"]self.factory.session["zip_id"]

======================================================================
ERROR: test_middleware (dj_geo.tests.IPToZipMiddleWareTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "c:\dj_site_test\dj_geo\tests.py", line 36, in test_middleware
    assert self.factory._session["zip_id"] != None
AttributeError: 'RequestFactory' object has no attribute '_session'

----------------------------------------------------------------------



@override_settings(MIDDLEWARE_CLASSES=(
    'dj_geo.middleware.IPToZipMiddleWare'
))
class IPToZipMiddleWareTest(TestCase):

    def test_middleware(self):
        Zipcode.syncdb()
        assert Zipcode.objects.all().count() > 0

        self.factory = RequestFactory()
        self.request = self.factory.get('/', {}, **{'REMOTE_ADDR':'108.31.178.99'})
        assert self.factory._session["zip_id"] != None
        assert self.factory._session["zip_id"] != ""

【问题讨论】:

    标签: django django-testing django-tests


    【解决方案1】:

    使用中间件保存会话信息以请求:

    from django.contrib.sessions.middleware import SessionMiddleware
    
    request = RequestFactory().get('/')
    middleware = SessionMiddleware()
    middleware.process_request(request)
    request.session.save()
    

    【讨论】:

    • 我开始使用这个解决方案在 Django 4.0 上获得TypeError: __init__() missing 1 required positional argument: 'get_response'。我通过middleware = SessionMiddleware(lambda x: x)解决了虽然我不知道,如果它真的是正确的解决方案。
    【解决方案2】:

    您可能需要使用SessionMiddleware 来处理您的请求,然后将其保存以存储会话。你可以参考这个article。我也不认为直接访问工厂的受保护属性是一个好主意,比如self.factory._session["zip_id"],它只会让你陷入更多问题。祝你好运!

    【讨论】:

      【解决方案3】:

      您需要为此使用Client 而不是RequestFactory

      self.factory = Client()
      

      【讨论】:

      • 这对我不起作用。仍然收到AttributeError: 'TemplateResponse' object has no attribute 'session'
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-24
      • 2018-05-03
      • 1970-01-01
      • 2018-10-01
      • 1970-01-01
      • 2015-10-24
      • 2012-10-19
      相关资源
      最近更新 更多