【问题标题】:Scan Django App Modules扫描 Django 应用模块
【发布时间】:2014-10-07 00:18:06
【问题描述】:

我正在开发一个新类来为我的 django 应用程序添加一些功能,并且需要扫描/收集从该类继承的每个类。我已经准备好在我导入的特定模块中扫描它们的一切,但我想知道最好的方法是在我的每个应用程序中扫描特定文件(只是我定义的那个) ?我知道其他一些应用程序会做这样的事情,显然 django 本身就是这样做的。我可能可以一起破解一些东西来扫描文件系统,但我想知道是否有更好/通用的方法来解决这个问题?我找不到太多关于它的信息。

我总是可以只在单个包中定义类,但由于它们与应用程序相关联,我认为最好在每个应用程序中定义它们,而不是从各处导入模型。

示例所需接口:

def get_app_implementations(module_name):
     # ... What's the least hacky way to get each of the app packages?
     # in a way that they can be imported using __import__ or the likes
     results = []
     for package in packages:
         try:
             scanned = __import__("{0}.{1}".format(package,module_name))
             results.append(scanned)
         except ImportError:
             pass
     return results

【问题讨论】:

    标签: python django python-import


    【解决方案1】:

    您可能会考虑另一种方法。您可以通过使用元类让模型本身在您的系统中注册,而不是扫描模型以找到相关的模型。 Marty Alchin 有一个很好的例子来说明一个简单的方法。

    【讨论】:

    • 这看起来很有希望,而且感觉更干净。谢谢!
    • 有没有办法让 django 在每个应用程序包中自动导入一个模块,这样我的插件就可以注册而无需显式调用导入? ;)
    • 听起来像 1.7 中的新 AppConfig functionality 就是你想要的。
    • AppConfig 如果我想为我的 1... 应用程序中的每一个输入一个导入语句会很好,但我记得看到过这个:django.utils.module_loading.autodiscover 被 django 管理员使用,结果是非常适合我想要的。我只需在我的根应用程序的 urls.py 中调用autodiscover('my_module'),它就会自动在 my_module.py 中为每个应用程序注册我的所有插件。
    • 链接到详细说明我的解决方案的要点。将所有内容归结为一个简单的装饰器,它将在任何 django 应用程序中自动注册基类的实现,而无需显式导入! gist.github.com/RutledgePaulV/6fb72a4b700e5b3ff3fd
    【解决方案2】:

    看起来以下内容可以满足我的需求,但我仍然很好奇是否有更好的解决方案。

    #loader.py
    from django.conf import settings
    import importlib
    
    def load_from_apps(name):
    
        results = []
        for app in settings.CUSTOM_APPS:
            try:
                scanned = importlib.import_module("{0}.{1}".format(app, name))
                results.append(scanned)
            except ImportError:
                pass
        return results
    
    
    
    #settings.py
    INSTALLED_APPS = (
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
    )
    
    CUSTOM_APPS = (
        'CustomApp1',
        'CustomApp2'
    )
    
    INSTALLED_APPS += CUSTOM_APPS
    

    【讨论】:

      猜你喜欢
      • 2012-04-18
      • 2021-03-21
      • 2014-09-07
      • 2017-11-20
      • 2014-10-13
      • 1970-01-01
      • 2016-05-03
      • 2021-08-17
      • 2020-12-11
      相关资源
      最近更新 更多