2015-10-21 3 views
0

Это оказалось трудно найти через поиск из-за того, что слово «сообщение» было настолько вездесущим в документации. Я использую сообщения Django (django.contrib.messages) и хотел бы подключить их к функциям ведения журнала. Так что, если у меня есть это, к примеру ...Написание сообщений Django для регистрации файлов также

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

Вы нашли ответы полезными? – FSp

ответ

1

Я хотел бы сделать так:

  1. messages создать -как приложение в вашем проекте:

    myproject/ 
        messages/ 
         __init__.py 
    
  2. в файле __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) 
    
  3. определяют обработчик для "сообщений" журналы в вашей LOGGING переменная (в файле settings)

  4. импортировать ваш l ibrary вместо django.contrib.messages

Это немного «скучный» писать, но я думаю, что это достаточно универсален, чтобы быть повторно использованы в нескольких местах. Конечно, вы можете позаботиться о переопределении и других функций, найденных в django.contrib.messages.

К сожалению, не имеет смысла говорить о подклассификации структуры сообщений django, поскольку это не определено как класс.

Надеюсь, это поможет

+0

Спасибо, я думаю, что это подход, который я буду использовать. – trpt4him

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