繁体   English   中英

Django子目录视图并从__init__.py导入所有文件

[英]Django sub-directory views and import all files from __init__.py

从技术上讲不是Django问题,更多是python问题。

在urls.py中,我有以下内容:

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'),
)

如果我使__ init __.py包含以下内容,这当然是有可能的:

from .index import index
...

但是在执行完第99次之后,最好将它自动化。 我已经与__ import __之类的东西打交道了,但是想知道是否还有其他人可以使用代码片段和/或更好的方式来处理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__))

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

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

然后您的urls.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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM