在Django App

时间:2015-10-12 23:18:22

标签: python django warnings

我想向一个旧的基于函数的视图添加一个警告,警告用户我们正在转向基于类的视图。我在Django中一直看到这些警告,例如RemovedInDjango19Warning。这真的很酷。

def old_view(request, *args, **kwargs):
    print('I can see this message in my terminal output!')
    warnings.warn("But not this message.", DeprecationWarning, stacklevel=2)
    view = NewClassBasedView.as_view()
    return view(request, *args, **kwargs)

我在终端输出中看到print语句,但没有看到警告本身。我在终端上收到Django的其他警告(如前面提到的RemovedInDjango19Warning,但不是这个。

我错过了什么吗?我是否必须在某个特定的导入级别上发出警告(即使它对Django有广泛的作用)?

1 个答案:

答案 0 :(得分:4)

假设您使用的是Django 1.8并且没有日志记录配置,可以阅读Django documentation

  

Django使用Python的内置日志记录模块来执行系统日志记录。 Python自己的文档中详细讨论了该模块的用法。

所以你可以这样做:

# import the logging library
import logging

# Get an instance of a logger
logger = logging.getLogger(__name__)

def my_view(request, arg1, arg):
    ...
    if bad_mojo:
        # Log an error message
        logger.error('Something went wrong!')

日志记录模块非常有用且功能太多,我建议你看一下Python logging documentation,你可以这样做:

FORMAT = '%(asctime)-15s %(clientip)s %(user)-8s %(message)s'
logging.basicConfig(format=FORMAT)
d = {'clientip': '192.168.0.1', 'user': 'fbloggs'}
logger = logging.getLogger('tcpserver')
logger.warning('Protocol problem: %s', 'connection reset', extra=d)

输出到:

  

2006-02-08 22:20:02,165 192.168.0.1 fbloggs协议问题:连接重置

格式化所有邮件,并向用户发送非常棒的邮件。

如果要使用警告模块,则必须知道默认情况下Python不会显示应用程序上引发的所有警告。有两种方法可以改变这种行为:

  1. 按参数:您必须使用-Wd参数调用python来加载默认过滤器,这样您就可以python -Wd manage.py runserver来调用测试服务器。

  2. 按程序:您只需要调用warnings.simplefilter('default')函数一次。你可以从任何地方调用这个函数,但你必须确保在调用warnings.warn之前执行这一行,在我的测试中,我将它放在settings.py文件的开头,但我不是确定那是最好的地方。项目包的__init__.py文件将是一个不错的地方。