Общая терминология заключается в том, что если вы не предоставляете никакого конструктора в своем объекте, конструктор без аргументов автоматически помещается, который называется конструктором по умолчанию.
Если вы определите конструктор, такой же, как тот, который будет быть помещенным, если вы не предоставляете его вообще, как его обычно называют конструктором без аргументов. Как правило, хотя какой-то программист предпочитает называть этот явно определенный конструктор аргументов как конструктор по умолчанию. Но если мы идем путем именования, если мы явно определяем его, но не делаем его по умолчанию.
Согласно docs
Если класс не содержит конструктор, тогда конструктор по умолчанию, не имеющий формальных параметров, и предложение throws неявно объявлено.
Пример
public class Dog
{
}
будет автоматически изменен (путем добавления конструктора по умолчанию) следующим образом
public class Dog{
public Dog() {
}
}
, и когда вы создаете его объект
Dog myDog = new Dog();
, этот конструктор по умолчанию вызывается.
Позвольте мне отвечать на свой собственный вопрос. Базовая проблема здесь состоит в том, что settings.py импортируется дважды, или возможно еще больше (См. здесь ). (Я все еще не понимаю, почему это. Возможно, некоторый эксперт Django мог объяснить это мне.) Это, кажется, верно для некоторых других модулей также. В этой точке я не думаю, что мудро сделать предположения о том, сколько раз settings.py будет импортировано. В этом отношении такие предположения не безопасны в целом. У меня был этот код в местах кроме settings.py, и результаты подобны.
необходимо кодировать вокруг этого. Таким образом, необходимо проверить регистратор на существующие обработчики прежде, чем добавить дополнительные обработчики к нему. Это немного ужасно, потому что совершенно разумно иметь несколько обработчиков - даже того же типа - подключенный к одному регистратору. Существует несколько решений контакта с этим. Каждый - проверка свойство обработчиков Вашего объекта регистратора. Если Вы только хотите один обработчик и Вашу длину> 0, то не добавляйте его. Лично я не люблю это решение, потому что это становится грязным с большим количеством обработчиков.
я предпочитаю что-то вроде этого (благодаря Thomas Guettler):
# file logconfig.py
if not hasattr(logging, "set_up_done"):
logging.set_up_done=False
def set_up(myhome):
if logging.set_up_done:
return
# set up your logging here
# ...
logging.set_up_done=True
я должен сказать, я желаю того, что Django импортирует settings.py, многократно были лучше зарегистрированы. И я предположил бы, что моя конфигурация является так или иначе причиной это, несколько импортируют, но я испытываю затруднения при обнаружении того, что вызывает проблему и почему. Возможно, я просто не мог найти, что в их документах, но буду думать, что это - вид вещи, о которой необходимо предупредить пользователей.
Трудный прокомментировать Ваш конкретный случай. Если settings.py выполняется дважды, то нормально, что Вы получаете две строки для каждого отправленного журнала.
у Нас была та же проблема, таким образом, мы настраиваем ее в наших проектах выделить один модуль входу. То, что модули имеют "одноэлементный шаблон" модуля, так, чтобы мы только выполнили интересный код однажды.
Это похоже на это:
def init_logging():
stdoutHandler = logging.StreamHandler( sys.stdout )
stdoutHandler.setLevel( DEBUG )
stdoutHandler.setFormatter( logging.Formatter( LOG_FORMAT_WITH_TIME ) )
logging.getLogger( LOG_AREA1 ).addHandler( stdoutHandler )
logInitDone=False #global variable controlling the singleton.
if not logInitDone:
logInitDone = True
init_logging()
Импорт log.py первый раз настроит вход правильно.
Вы могли обойти свою проблему путем проверки на количество обработчиков при выполнении init.
def init_logging():
stdoutHandler = logging.StreamHandler( sys.stdout )
stdoutHandler.setLevel( DEBUG )
stdoutHandler.setFormatter( logging.Formatter( LOG_FORMAT_WITH_TIME ) )
logger = logging.getLogger( LOG_AREA1 )
if len(logger.handlers) < 1:
logger.addHandler( stdoutHandler )
я не думаю, что это - отличный способ обработать его. Лично, для входа в систему django с Python, регистрирующим модуль, я создаю регистратор в views.py для каждого приложения, которым я интересуюсь, затем захватите регистратор в каждой функции представления.
from django.http import HttpResponse
from magic import makeLogger
from magic import getLogger
makeLogger('myLogName', '/path/to/myLogName.log')
def testLogger(request):
logger = getLogger('myLogName')
logger.debug('this worked')
return HttpResponse('TEXT, HTML or WHATEVER')
Это - довольно хорошая статья об отладке django и покрывает некоторый вход: http://simonwillison.net/2008/May/22/debugging/
Почему использование регистратора Python вместо django-входа? Дайте ему попытку, это могло бы просто решить Вашу проблему.
http://code.google.com/p/django-logging/wiki/Overview
В данный момент это только позволило бы просматривать корневой регистратор, но Вы можете верная запись к нескольким регистраторам.
hackish путь, но можно попытаться поместить регистрирующийся код в admin.py. Это, как предполагается, импортируется только однажды.
, Кроме того; можно ли сначала проверить, существует ли MyApp.views.scans
журнал? Если это существует (возможно, ошибка повышена), можно просто пропустить создание (и поэтому не добавить обработчик снова). Более чистый путь, но я не попробовал это все же.
Также должно быть более соответствующее место для помещения этого кода (__init__.py
?). settings.py
для настроек.
Чтобы ответить на вопрос, почему «Django импортирует settings.py несколько раз»: это не так.
Вы, вероятно, используете многопроцессорный / многопоточный веб-сервер, который создает несколько суб-интерпретаторов Python, каждый из которых импортирует код из вашего приложения django один раз.
Проверьте это на тестовом сервере django, и вы должны увидеть эти настройки не импортируются много раз.
Некоторое время назад я разработал хороший синглтон (точнее, версию python borg идиомы) с моим первым приложением django / apache, прежде чем я быстро понял, что да, у меня было несколько экземпляров моего синглтона, созданного ...
Чтобы ответить на вопрос, почему «Django импортирует settings.py несколько раз»: нет.
На самом деле, он импортируется дважды (пропустите первый фрагмент кода, чтобы сразу перейти к нему, но стоит его прочитать, если у вас есть время):
http://blog.dscpl.com.au/ 2010/03/ Улучшенный-wsgi-script-for-use-with.html
PS - Извините, что восстанавливаю старую ветку.