You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django测试中同一匿名客户端session_key丢失问题咨询

Django测试中匿名客户端会话丢失的原因及解决办法

问题原因

Django的TestCase类默认会在每个测试方法执行前后重置测试环境,包括清空数据库、销毁会话数据。哪怕你在同一个测试类里复用同一个匿名客户端实例,第一个测试方法结束后,之前创建的session会被自动清理,客户端的会话cookie也会失效,所以第二个测试方法里发送请求时,request对象自然拿不到之前的session_key。

代码潜在问题

你的_check_session方法里使用了中文单引号‘session_key’,这会触发语法错误,需改为英文单引号'session_key':

def _check_session(self, request) -> int | str:
        session_key = getattr(request.session, 'session_key', None)
        if session_key:
            return session_key
        else:
            request.session.create()
            return request.session.session_key

解决办法

方法1:用TransactionTestCase替代TestCase

TransactionTestCase不会在每个测试方法后重置会话,适合跨测试方法共享会话的场景:

from django.test import TransactionTestCase

class YourCartTest(TransactionTestCase):
    def setUp(self):
        self.client = self.client_class()
    
    def test_add_to_cart(self):
        response = self.client.post('/add-to-cart/', data={'product_id': 1})
        # 你的断言逻辑
    
    def test_get_cart(self):
        response = self.client.get('/get-cart/')
        # 你的断言逻辑

方法2:在测试前置逻辑中初始化会话

如果不想更换测试类类型,可以在setUp方法里提前创建会话,确保每个测试方法都能拿到有效session:

from django.test import TestCase

class YourCartTest(TestCase):
    def setUp(self):
        self.client = self.client_class()
        # 提前创建会话
        self.client.session.create()
    
    def test_add_to_cart(self):
        response = self.client.post('/add-to-cart/', data={'product_id': 1})
        # 你的断言逻辑
    
    def test_get_cart(self):
        response = self.client.get('/get-cart/')
        # 你的断言逻辑

方法3:手动传递会话Cookie

在第一个测试方法结束后保存会话Cookie,第二个测试方法里手动设置到客户端:

class YourCartTest(TestCase):
    def test_add_to_cart(self):
        response = self.client.post('/add-to-cart/', data={'product_id': 1})
        # 保存会话Cookie
        self.session_cookie = self.client.cookies.get('sessionid')
    
    def test_get_cart(self):
        if self.session_cookie:
            self.client.cookies['sessionid'] = self.session_cookie.value
        response = self.client.get('/get-cart/')
        # 你的断言逻辑

内容的提问来源于stack exchange,提问作者Андрей

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 22:34:53