我有 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,
},
}
}
在 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')
其中“激活”是 App1/views.py 中的一个函数。我换了'App1.views.activate'
在 'MyProject.app1.views.activate'
它工作正常。我在控制台中只有一行 print __name__
.我想我只有一行,因为 'disable_existing_loggers': True,但我无法解释的是,这个解决方案使我的 views.py 只解析一次而不是两次。为确保这一点,我添加了 print "blabla"
在文件的开头。在第一种情况下,他打印了两次,在第二种情况下只打印了一次。
最佳答案
公平警告:我不确定这是否正确,我的一些内容基于我很久以前读过的东西,但现在在 google 中找不到。
您所看到的是 python 导入机制如何工作的副作用。当一个模块被导入时,它被放入 sys.modules
,但是,如果可以在两个不同的虚线路径下导入模块(在这种情况下,有或没有 MyProject),它可以导入两次,每个 __name__
下一次。 .
根本的解决方法是确保 MyProject
它不在 sys.path
- 包含 MyProject
的目录应该是,但不是 MyProject
本身。您可以通过启动 manage.py shell
来验证这是否已完成。并确保 import evenements
失败。在 manage.py
中有一些 Django 内部结构这可能会使这变得困难 - 但我最后一次遇到这个是在 1.0 或 1.1 左右,所以它很可能已经被修复了。
这里有一个深入的讨论:
http://blog.dscpl.com.au/2010/03/improved-wsgi-script-for-use-with.html
文章很长,搜索“两个不同的名字”。
关于python - Django 日志记录项目和应用程序命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8911992/