2017-09-26 55 views
1

我不知道什么措辞这个问题的最好办法,但我注意到,如果我有说,在项目目录本文件:Django是否在其项目目录中执行所有python文件?

a.py

import logging 
import track 

from raven.contrib.django.raven_compat.models import client 
from django.conf import settings 

from .MetricLogger import log_metrics 


_LOG = logging.getLogger('application') 


class TrackingClass(track.SubClass): 
    def record(self, *args, **kwargs): 
     try: 
      metrics = { 
       "metric": 'something', 
       "trigger": 'request', 
       "element": 'request' 
      } 

      # log_metrics(None, metrics) 
     except Exception: 
      client.captureException() 

track.tracker.register(EventsappTrackingPixel) # this line gets called at some point without importing this module 

打印语句被调用。发生了什么,触发了什么?这是需要完成的类索引的一部分吗?或者这是如何工作的?

编辑: 原来我们所依赖的音轨包是专门在根目录下查找这个文件名并导入它!

+0

当你做什么时,打印被调用? – wim

+0

@wim,我真的很困惑什么时候被调用。我将这个示例放在我们的代码库中...而不是打印它是另一个对此像素跟踪器的库调用,它应该在文件中注册该类。我正在更新我的问题中的示例,以使其更清楚,更类似于我们实际拥有的内容 – Jaime

+0

@wim我被告知导入此文件的方式如何导入admin.py。我不确定那是什么意思。 – Jaime

回答

-1

print的调用不是类定义的一部分。它在模块级别,因此在模块导入时执行。

您可以通过检查调用堆栈来确定触发导入的内容。右侧插入后(或之前)的调用print这两条线:

import traceback 
traceback.print_stack() 
+0

Django不会(或者不应该) t)导入模块,但。 – wim

+0

@wim:为什么不呢?例如,如果该模块是应用程序的'models.py',那么它将在启动时导入。间接地也可以发生,例如如果模块是从另一个模块导入的 –

+1

没错,但OP只是说它是项目目录中的'a.py'。仍在等待澄清什么行动触发器打印。 – wim

0

Django不自动导入目录中的所有文件。它只会自动导入某些文件(如果存在的话) - 例如models.py,apps.py.

如果你在目录中有其他自定义模块(例如profanityDetector.py),你将需要自己导入它。 (也许把它放在apps.py里面)

所有的模块只在django/per worker进程中导入[0,1]次。


这意味着,如果你没有明确地从其他模块中导入a.py。这是因为您通过django的日志记录系统将其注册为回调。

相关问题