代码之家  ›  专栏  ›  技术社区  ›  koblas

Django子目录视图并从初始化导入所有文件

  •  2
  • koblas  · 技术社区  · 15 年前

    技术上不是django问题,更多的是python问题。

    urlpatterns = patterns('locate.views',
        url(r'^',  'index.index'),
    )
    

    以及这样的目录结构:

    locate/
      views/
        __init__.py
        index.py      #  where there is "def index(request) : ...."
    

    我想做的是避免说“index.index”,而是让事情变得平坦一些。从而产生:

    urlpatterns = patterns('locate.views',
        url(r'^',  'index'),
    )
    

    from .index import index
    ...
    

    但在第99次这样做之后,最好能实现自动化。我已经接触到一些关于导入之类的东西,但是我想知道是否还有其他人有一个有效的代码片段和/或在django中处理这个模式的更好的方法。

    更新 Amit代码的使用版本:

    views/__init__.py 文件(将很快拉到库中):

    from glob import glob1
    from types import FunctionType
    import os
    
    def import_views(dirname, views_prefix='') :
        for filename in glob1(dirname, '*.py'):
            if filename == '__init__.py':    # I assume you don't want that
                continue
    
            module_name = os.path.basename(filename).split('.py')[0]
    
            # You might need to change this, depending on where you run the file:
            imported_module = __import__("%s.%s" % (__package__, module_name), fromlist=[module_name,])
    
            idict = imported_module.__dict__
    
            for method_name in idict.get('__all__', idict.keys()):
                method = idict[method_name]
                if not isinstance(method, FunctionType):
                    continue
                if views_prefix and not method_name.startswith(views_prefix):
                    continue
                globals()[method_name] = method
    
    import_views(os.path.dirname(__file__))
    
    1 回复  |  直到 14 年前
        1
  •  1
  •   amito    14 年前

    我认为通过其他文件导入有点尴尬,所有视图都应该直接导入,就像现在这样。 但是,您可以创建views.py文件并从中导入所有相关的view方法,dir结构将保持不变,只需在views/dir下添加views.py文件。文件中的代码本身应该类似于:

    from .index import index
    from .other_view import other_view_method
    ...
    

    然后url.py文件中的代码:

     urlpatterns = patterns('locate.views',
        url(r'^',  'index.index'), )
    

    会变成:

    urlpatterns = patterns('locate.views.views',
        url(r'^',  'index'),
    )
    

    但是,如果仍要运行所有*.py文件并从中获取所有视图方法,则可以创建首先运行并加载所有视图的加载程序文件,代码应如下所示:

    from glob import glob1
    from types import FunctionType
    
    VIEW_METHOD_PREFIX = ''    # Whatever you like here, I suggest you use something
    VIEWS_DIR          = 'views'    # Where you views are
    
    def import_views():
    
        for filename in glob1(VIEWS_DIR, '*.py'):
            if filename == '__init__.py':    # I assume you don't want that
                continue
    
            module_name = os.path.basename(filename).split('.py')[0]
    
            # You might need to change this, depending on where you run the file:
            imported_module = __import__(
                module_name, fromlist=[module_name,])  
    
            for method_name, method in imported_module.__dict__.iteritems():
                if not isinstance(method, FunctionType):
                    continue
                if not method_name.startswith(VIEW_METHOD_PREFIX):
                    continue
                globals()[method_name] = method
    

    然后在urls.py中添加:

    import_views()