У меня проблема с регистрацией в Django. Кстати, ответы на этот вопрос помогут мне уточнить, как работают пространства имен Django.
Вот структура моего проекта:
MyProject:
-App1:
....
views.py
-App2:
....
urls.py
settings.py
Мне нравится регистрировать все сообщения в одном файле. Затем я настроил в settings.py следующий логгер:
LOGGING = {
'version': 1,
'disable_existing_loggers': True,
'formatters': {
'verbose': {
#'format': '%(levelname)-8s %(remote_addr)-15s %(path_info)s %(asctime)s %(name)-20s %(funcName)-15s %(message)s'
'format': '%(levelname)-8s %(asctime)s %(name)-20s %(funcName)-15s %(message)s'
},
},
'handlers': {
'normal': {
'level': 'DEBUG',
'class': 'logging.FileHandler',
'formatter': 'verbose',
'filename': os.path.join('C:/dev/Instantaneus/Instantaneus/html/static', 'log', 'normal.log')
},
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'formatter': 'verbose',
},
},
'loggers': {
'MyProject': {
'handlers': ['normal','console'],
'level': 'DEBUG',
#'filters': ['request'],
'propagate': True,
},
}
}
In urls.py:
from MyProject.App1.views import EvenementDetailView,
....
url(r'App1/(?P<pk>\d+)/$', login_required(EvenementDetailView.as_view(model=Evenement)), name='evenement_details'),
и в App1 / views.py:
from django.views.generic import DetailView
import logging
logger = logging.getLogger(__name__)
....
class EvenementDetailView(DetailView):
print __name__
model=Evenement
....
logger.debug('blabla')
В браузере, когда я звоню http://localhost/App1/3
, в консоли появляется следующее:
DEBUG 2012-01-18 14:59:04,503 Myproject.evenements.views EvenementDetailView blabla
MyProject.evenements.views
evenements.views
Тогда мой вопрос: почему код print __name__
выполняется дважды, и самое важное, почему выходные данные не совпадают?
Я предполагаю, что журнал DEBUG
появляется только один раз, потому что evenement.views
не может распространяться на MyProject, потому что в этом случае root равен evenements
Есть идеи?
Решение, не с подробным объяснением, но оно работает:
В моем urls.py у меня была строка url(r'App1/(?P<pk>\d+)/activate/$', 'app1.views.activate')
, где 'activ' - это функция в App1 / views.py. Я изменил 'App1.views.activate'
в 'MyProject.app1.views.activate'
, и он работает нормально. У меня только одна строка в консоли для print __name__
. Я думаю, что у меня есть только одна строка из-за 'disable_existing_loggers': True, но я не могу объяснить, что это решение заставило мои views.py анализировать только один раз, а не два раза раньше. Чтобы быть уверенным в этом, я добавил print "blabla"
в начале файла. В первом случае он печатается два раза, а во втором - только один раз.