Django:关闭HTTP响应消息的控制台输出

5 投票
3 回答
4132 浏览
提问于 2025-04-16 18:36

我们用Django做了一个应用,每次收到请求时,它都会在控制台上打印出很多HTTP响应信息。

[Date String] 'GET /urlpath/..blah blah ' 200 216
[Date String] 'DELETE /anotherurl/..blah blah ' 200 205 
...
..

我们已经关闭了所有的日志输出,把Debug设置为False。还试过用'python manage.py runserver --verbosity 0'命令。甚至尝试把sys.stdout改成一个NullDevice()类。但是,我们就是无法关闭这些响应信息,这让服务器变得非常慢。其他的消息都能关闭,唯独这些不行。有没有什么建议?

我知道Django的内置服务器只是为了开发用的,不适合生产环境,但我们希望在开发版本中也能有不错的速度(不想深入了解如何在Apache/lighttpd后面部署Django)。

3 个回答

2

内置的开发服务器并不是为了性能而设计的,所以建议使用gunicorn。你可以把它添加到你的Django项目中,这样就能使用一个命令run_gunicorn,作为runserver的替代。它比内置的开发服务器快很多,响应也更灵敏。如果你想的话,还可以通过--log-level来设置gunicorn的日志级别。它也很容易部署,适合用于生产环境。

3

你可以继续使用控制台日志记录,但通过这个小修改,你可以完全屏蔽掉一些噪音信息,比如

GET /urlpath/..blah blah ' 200 216
...

这些信息的HTTP结果代码都是200,表示请求成功。在你的站点包目录或者虚拟环境(如果你在用的话)里,找到这个文件夹结构:django / core / servers / basehttp.py

然后找到

WSGIRequestHandler

函数定义log_message(self, format, *args)

# Don't bother logging requests for admin images or the favicon.
if (self.path.startswith(self.admin_media_prefix)
        or self.path == '/favicon.ico'):
    return

之后插入

# START ----- Don't show page requests which have run successfully
if args[1] == '200':
    return
# END ----- Don't show page requests which have run successfully

这是一种针对Python 2.7.3和Django 1.4.3的临时解决办法,我也希望能找到更好的定制方法,嘿!

2

你只需要在Django的日志设置中添加一些内容:

    'loggers': {
        # django's default logger
        'django.server': {
            'handlers': ['django.server'],
            'level': 'INFO',
            'propagate': False,
        },
    }

你可以覆盖Django默认的日志记录器:https://github.com/django/django/blob/32265361279b3316f5bce8efa71f2049409461e3/django/utils/log.py#L18

Django默认的内置日志记录器是怎么工作的:https://docs.djangoproject.com/en/1.10/topics/logging/#id3

使用自定义的CallbackFilter过滤器:https://docs.djangoproject.com/en/1.10/topics/logging/#django.utils.log.CallbackFilter

撰写回答