Python, входящий в систему Django

Общая терминология заключается в том, что если вы не предоставляете никакого конструктора в своем объекте, конструктор без аргументов автоматически помещается, который называется конструктором по умолчанию.

Если вы определите конструктор, такой же, как тот, который будет быть помещенным, если вы не предоставляете его вообще, как его обычно называют конструктором без аргументов. Как правило, хотя какой-то программист предпочитает называть этот явно определенный конструктор аргументов как конструктор по умолчанию. Но если мы идем путем именования, если мы явно определяем его, но не делаем его по умолчанию.

Согласно docs

Если класс не содержит конструктор, тогда конструктор по умолчанию, не имеющий формальных параметров, и предложение throws неявно объявлено.

Пример

public class Dog
{
}

будет автоматически изменен (путем добавления конструктора по умолчанию) следующим образом

public class Dog{
    public Dog() {

    }
} 

, и когда вы создаете его объект

 Dog myDog = new Dog();

, этот конструктор по умолчанию вызывается.

41
задан Jeff 5 December 2008 в 09:34
поделиться

7 ответов

Позвольте мне отвечать на свой собственный вопрос. Базовая проблема здесь состоит в том, что 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, многократно были лучше зарегистрированы. И я предположил бы, что моя конфигурация является так или иначе причиной это, несколько импортируют, но я испытываю затруднения при обнаружении того, что вызывает проблему и почему. Возможно, я просто не мог найти, что в их документах, но буду думать, что это - вид вещи, о которой необходимо предупредить пользователей.

30
ответ дан Jeff 23 September 2019 в 15:08
поделиться

Трудный прокомментировать Ваш конкретный случай. Если 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 первый раз настроит вход правильно.

14
ответ дан Philippe F 23 September 2019 в 15:08
поделиться

Вы могли обойти свою проблему путем проверки на количество обработчиков при выполнении 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/

4
ответ дан 23 September 2019 в 15:08
поделиться

Почему использование регистратора Python вместо django-входа? Дайте ему попытку, это могло бы просто решить Вашу проблему.

http://code.google.com/p/django-logging/wiki/Overview

В данный момент это только позволило бы просматривать корневой регистратор, но Вы можете верная запись к нескольким регистраторам.

1
ответ дан Sergey Golovchenko 23 September 2019 в 15:08
поделиться

hackish путь, но можно попытаться поместить регистрирующийся код в admin.py. Это, как предполагается, импортируется только однажды.

, Кроме того; можно ли сначала проверить, существует ли MyApp.views.scans журнал? Если это существует (возможно, ошибка повышена), можно просто пропустить создание (и поэтому не добавить обработчик снова). Более чистый путь, но я не попробовал это все же.

Также должно быть более соответствующее место для помещения этого кода (__init__.py?). settings.py для настроек.

0
ответ дан muhuk 23 September 2019 в 15:08
поделиться

Чтобы ответить на вопрос, почему «Django импортирует settings.py несколько раз»: это не так.

Вы, вероятно, используете многопроцессорный / многопоточный веб-сервер, который создает несколько суб-интерпретаторов Python, каждый из которых импортирует код из вашего приложения django один раз.

Проверьте это на тестовом сервере django, и вы должны увидеть эти настройки не импортируются много раз.

Некоторое время назад я разработал хороший синглтон (точнее, версию python borg идиомы) с моим первым приложением django / apache, прежде чем я быстро понял, что да, у меня было несколько экземпляров моего синглтона, созданного ...

3
ответ дан 27 November 2019 в 00:24
поделиться

Чтобы ответить на вопрос, почему «Django импортирует settings.py несколько раз»: нет.

На самом деле, он импортируется дважды (пропустите первый фрагмент кода, чтобы сразу перейти к нему, но стоит его прочитать, если у вас есть время):

http://blog.dscpl.com.au/ 2010/03/ Улучшенный-wsgi-script-for-use-with.html

PS - Извините, что восстанавливаю старую ветку.

6
ответ дан 27 November 2019 в 00:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: