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

在Django应用单元测试中禁用错误请求日志输出

问题:Django单元测试时如何禁用Bad Request日志输出

我的Django应用单元测试运行正常,但控制台会输出Bad Request: /api/v1/users/register/这类错误请求日志,干扰测试进度标识的查看。

测试代码示例

def test_user_register_username_error(self):
    data = {
        'username': 'us',
        'email': 'mail@mail.mail',
        'password': 'pass123123',
        'password_again': 'pass123123'
    }

    url = self.register_url

    response = client.post(url, data=data)

    self.assertEqual(response.status_code, 400)
    self.assertFalse(User.objects.filter(username='us').first())

当前控制台输出

Found 22 test(s).
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
...........Bad Request: /api/v1/users/register/
.Bad Request: /api/v1/users/register/
.Bad Request: /api/v1/users/register/
.Bad Request: /api/v1/users/register/
.Bad Request: /api/v1/users/register/
..Bad Request: /api/v1/users/register/
.Bad Request: /api/v1/users/activate/
.Bad Request: /api/v1/users/login/
.Bad Request: /api/v1/users/recovery/
Bad Request: /api/v1/users/recovery/
.Bad Request: /api/v1/users/register/
.
----------------------------------------------------------------------
Ran 22 tests in 6.350s

OK

期望输出

Found 22 test(s).
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
......................
----------------------------------------------------------------------
Ran 22 tests in 6.350s

OK

已确认代码中无自定义print或logging语句,希望禁用这类日志输出,仅保留测试进度标识。


解决方法

这些日志来自Django的django.request日志器,默认会将4xx请求输出到控制台。可通过以下方式禁用:

1. 在测试类中临时调整日志级别

在测试类的setUpClass或setUp方法中,将django.request的日志级别调高至ERROR(仅记录5xx及以上错误):

import logging
from django.test import TestCase

class YourUserTest(TestCase):
    @classmethod
    def setUpClass(cls):
        super().setUpClass()
        # 禁用django.request的4xx日志
        logging.getLogger('django.request').setLevel(logging.ERROR)

2. 在测试专用配置中修改日志规则

如果有单独的测试环境配置文件(如settings/test.py),直接修改日志配置:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
        },
    },
    'loggers': {
        'django.request': {
            'handlers': ['console'],
            'level': 'ERROR',  # 仅记录5xx级错误
            'propagate': False,
        },
    },
}

3. 用装饰器控制单个测试用例

若只需针对特定测试用例禁用日志,可编写装饰器:

import logging
from functools import wraps

def disable_django_request_warnings(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        logger = logging.getLogger('django.request')
        original_level = logger.level
        logger.setLevel(logging.ERROR)
        try:
            return func(*args, **kwargs)
        finally:
            logger.setLevel(original_level)
    return wrapper

# 在目标测试用例上使用
class YourUserTest(TestCase):
    @disable_django_request_warnings
    def test_user_register_username_error(self):
        # 测试代码...

内容的提问来源于stack exchange,提问作者NelttjeN

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 08:10:23