Skip to main content
 首页 » 编程设计

python之django.contrib.staticfiles.finders.find 需要帮助

2025年05月04日32langtianya

我有以下 Django 项目布局:

project_folder/ 
    app_folder/ 
        static/ 
           folder1/ 
               file1 
        templates/ 
        ... 
    compressor -> (symlink to django_compressor app with my modifications) 
    __init__.py 
    manage.py 
    settings.py 
    urls.py 

从我的 django_compressor 分支中指定的模板标签,我调用了一个执行以下操作的类:

class StorageMixin(object): 
    from django import VERSION as DJANGO_VERSION 
    if DJANGO_VERSION[:2] >= (1, 3): 
        from django.contrib.staticfiles.finders import find as _django_find 
        def _find_file_path(self, path): 
            return self._django_find(path) 
    else: 
        def _find_file_path(self, path): 
            static_roots = getattr(settings, 'STATIC_ROOTS', []) + [settings.COMPRESS_ROOT] 
            for root in static_roots: 
                filename = os.path.join(root, basename) 
                if os.path.exists(filename): 
                    return filename 
            return None 

因此,如果 django 是新版本,它会尝试使用静态文件查找器,否则通过 STATIC_ROOTS 配置变量模仿其基本查找器。

最后,问题:鉴于上面的文件夹布局,我将 "folder1/file1" 传递给 finders.find 方法,并且我有以下设置:

INSTALLED_APPS = ( 
 
    'django.contrib.auth', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    'django.contrib.sites', 
    'django.contrib.messages', 
    'django.contrib.staticfiles', 
 
    'compressor', 
    'app_folder', 
) 

和

TEMPLATE_LOADERS = ( 
    'django.template.loaders.filesystem.Loader', 
    'django.template.loaders.app_directories.Loader', 
#     'django.template.loaders.eggs.Loader', 
) 

我从 find 调用中得到 None。

有什么想法吗?

更新。更多奇怪的细节:我跑了

python manage.py shell 

做了

from django.contrib.staticfiles.finders import find 
find("folder1/file1") 

它给了我正确的结果...

请您参考如下方法:

答案是:导入整个模块,而不仅仅是find方法