Python Django self.client.post不使用decorator向视图发送数据

Python Django self.client.post不使用decorator向视图发送数据,python,django,post,python-unittest,django-unittest,Python,Django,Post,Python Unittest,Django Unittest,我有一个简单的测试用例,它检查POST请求是否具有有效数据,并返回一个包含200个状态代码的HTML响应: class PostRequestTestCase(TestCase): def test_valid_post_request(self): response = self.client.post('/foo/', data={'text': 'bar'}) self.assertEqual(response.status_code, 200)

我有一个简单的测试用例,它检查POST请求是否具有有效数据,并返回一个包含200个状态代码的HTML响应:

class PostRequestTestCase(TestCase):
    def test_valid_post_request(self):
        response = self.client.post('/foo/', data={'text': 'bar'})
        self.assertEqual(response.status_code, 200)
以下是针对该请求触发的视图foo:

logger = logging.getLogger(__name__)

# decorator to trace enter and exit events
enter_exit_tracer = enter_exit_Tracer(logger)

@enter_exit_tracer
def foo(request):  
    if request.method == 'POST':
        #
        print('request.POST:', request.POST)
        # 
        # some stuff
其中@enter\u exit\u tracer是跟踪函数进入/退出的装饰器:

def enter_exit_Tracer(logger):
    def middle(f): 
        def inner(*args, **kwargs):
            session_string = args[-1] if 'session_key' in args[-1] else '[]'
            logger.debug('%s Enter %s.', session_string, f.__name__)
            result = f(*args, **kwargs)
            logger.debug('%s Exit %s.',  session_string, f.__name__)
            return result
        return inner
    return middle
事实证明,当我将这个decorator添加到foo函数时,通过self.client.POST发送的POST数据实际上并没有传递给foo。测试请求中缺少它们-因此我的测试失败:

DEBUG: [] Enter foo.
request.POST: <QueryDict: {}>
ERROR: Invalid form
F
======================================================================
FAIL: test_valid_post_request (textstat.tests.PostRequestTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/user/Pro/myapp/tests.py", line 111, in test_valid_post_request
    self.assertEqual(response.status_code, 200)
AssertionError: 400 != 200

----------------------------------------------------------------------
Ran 1 test in 0.018s

FAILED (failures=1)
问题是:

在self.client.POST请求的情况下,为什么request.POST数据不通过decorator传递到视图? 如果装饰器有任何问题,那么为什么web请求可以正常工作? 是否可以保留decorator并使self.client.post将数据传递给视图?
事实证明,装饰程序在这一行中有一个TypeError错误:

session_string = args[-1] if 'session_key' in args[-1] else '[]'
因此,当args[-1]不是str时,这将不起作用。用strargs[-1]修复它可以解决缺少POST数据的整个问题


奇怪的是,self.client.post并没有引发任何类型错误,而且session\u字符串是以某种方式计算出来的。在没有任何错误或提示警告的情况下,没有将POST数据发送到视图。POST数据刚刚消失。同时,当从web浏览器发送POST请求时,相同的代码工作正常,因此错误仍然没有被注意到

日志记录是否被客户端调用?是的,日志记录在视图装饰器中初始化时被客户端调用。例如,我们在self.client.post中看到DEBUG:Enter foo。在输出日志中。实际上,我通过从装饰器发布的代码中删除了会话字符串=args[-1],如果args[-1]中的'session\u key',否则'[]'。我相信这行代码不可能是pb的原因。我错了,这条线是铅的来源。更多细节,请参阅下面我的回答。
session_string = args[-1] if 'session_key' in args[-1] else '[]'