由于单词" message"已经证明这很难通过搜索找到。在文档中无处不在。我正在使用Django消息(django.contrib.messages
),并希望将它们挂钩到日志记录功能中。所以,如果我有这个,例如......
if user is not None:
if user.is_active:
login(request, user)
else:
messages.error(request, 'Your account is disabled. Please contact your administrator.')
return HttpResponseRedirect('/accounts/login/')
...我还希望通过日志处理程序将消息错误写入特定的日志文件。有没有办法通过调用消息(或者可能是它的子类化版本?)来实现这一点,或者这只是需要显式调用messages.error()
以及logger
每条消息?
答案 0 :(得分:2)
我会这样做:
在您的项目中创建一个类似messages
的应用:
myproject/
messages/
__init__.py
在__init__.py
文件中,您可以使用函数定义:
from django.contrib import messages
import logging
logger = logging.getLogger("messages")
def debug(request, msg, *args, **kwargs):
messages.debug(request, msg, *args, **kwargs)
logger.debug(msg)
def info(request, msg, *args, **kwargs):
messages.info(request, msg, *args, **kwargs)
logger.info(msg)
def warning(request, msg, *args, **kwargs):
messages.warning(request, msg, *args, **kwargs)
logger.warning(msg)
def error(request, msg, *args, **kwargs):
messages.error(request, msg, *args, **kwargs)
logger.error(msg)
为"消息定义处理程序"登录LOGGING
变量(在settings
文件中)
导入您的库而不是django.contrib.messages
有点"无聊"写,但我认为它足够普遍,可以在几个地方重复使用。当然,您可以重新定义django.contrib.messages
中的其他功能。
不幸的是,谈论继承django消息框架并没有多大意义,因为它没有被定义为类。
希望有所帮助
答案 1 :(得分:0)
我建议您根据现有存储空间创建自定义MESSAGE_STORAGE
以满足您的需求。您需要做的就是重载add
方法。例如,这个基于CookieStorage
:
import logging
from django.contrib.messages import constants, utils
from django.contrib.messages.storage.cookie import CookieStorage
logger = logging.getLogger(__name__)
class CookieLoggerStorage(CookieStorage):
def add(self, level, message, extra_tags=''):
if message and level > constants.SUCCESS: # logs WARNING and ERROR
logger.log(level, message)
super(CookieLoggerStorage, self).add(level, message, extra_tags)
在settings.py
添加:
# settings.py
MESSAGE_STORAGE = "path.to.CookieLoggerStorage"
为了清楚起见,messages.constants似乎与记录器级别常量相同,因此您几乎可以使用消息级别提供记录器
django.contrib.messages.constants
DEBUG = 10
INFO = 20
SUCCESS = 25
WARNING = 30
ERROR = 40
logging constants
DEBUG 10
INFO 20
WARNING 30
ERROR 40
CRITICAL 50
NOTSET 0