2012-01-18 91 views
0

我有Django日誌記錄的問題。順便說一下,這個問題的答案將幫助我澄清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'), 

和應用1/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,因爲在這種情況下根本是evenements

任何想法?

解決方案,而不是與深入的解釋,但它的工作原理:

在我的urls.py,我有一個線url(r'App1/(?P<pk>\d+)/activate/$', 'app1.views.activate')其中「激活」是應用1/views.py的函數。我已更換'App1.views.activate''MyProject.app1.views.activate',它工作正常。 print __name__控制檯中只有一行。我想我只有一行,因爲'disable_existing_loggers':是的,但我無法解釋的是,這個解決方案使我的views.py只解析了一次而不是兩次。爲了確保我在文件的開頭添加了print "blabla"。在第一種情況下,他打印了兩次,只有第二種情況下打印。

回答

1

公平的警告:我不確定這是否正確,並且我基於一些我記得很久以前閱讀的內容,但現在無法在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

這是一個很長的文章,搜索「兩個不同的名字。」

+0

嗨,亞當。感謝您快速回答。正如你所建議的,我已經從Python路徑中刪除了父Directoy。他現在不在sys.path中,但結果是一樣的。關於長篇文章,我稍後會仔細看看,但對我的水平來說似乎有點複雜! – Youpsla 2012-01-18 18:13:03

+0

類似的問題:http://stackoverflow.com/a/8917273/16361 – AdamKG 2012-01-18 20:57:11

相關問題