Django:“使用自定义处理器导入请求处理器模块时出错”

时间:2013-06-21 09:57:07

标签: django

我已经实现了自己的上下文处理器,我正在尝试在django的设置中正确配置它:

from django.conf.global_settings import TEMPLATE_CONTEXT_PROCESSORS as DEFAULT_PROCESSORS
MY_CONTEXT_PROCESSORS = (
    'django.core.context_processors.request',
    'com.mysite.apps.myapp.processors.MyProcessor.MyProcessor.process',
)
TEMPLATE_CONTEXT_PROCESSORS = DEFAULT_PROCESSORS + MY_CONTEXT_PROCESSORS

但我收到以下错误:

  

导入请求处理器模块时出错   com.mysite.apps.myapp.processors.MyProcessor.MyProcessor:“没有模块   名为MyProcessor“

MyProcessor是一个带有静态方法“process”的简单类(我喜欢OOP,我在项目中使用类和包体系结构)。它退出并且拼写正确......所以出了什么问题?

更新

用简单的“process”函数替换我的类(“com.mysite.apps.myapp.processors.MyProcessor.process”)它有效......但我不满意...... Django如何加载这些处理器?我在我的应用程序(模型,测试,视图......)中随处使用包/类方法,它通常有用......这里的区别是什么?由于Python的动态特性,像“com.mysite.apps.myapp.processors.MyProcessor.MyProcessor”这样的路径应该独立于类或标准“子模块”来解决......你不同意吗?

2 个答案:

答案 0 :(得分:2)

Django不知道.是否表示该包中的子包或变量。 因此,foo.bar.baz.quux假设foobarbaz都是包,而quux(即最后一个值)是该模块的属性

TEMPLATE_CONTEXT_PROCESSORS最终导出的值由django.template.context.get_standard_processorssource code)导入。

这是该函数中相关的代码位:

i = path.rfind('.')
module, attr = path[:i], path[i+1:]

因此您无法访问模块中的嵌套值。在我能看到的任何地方都没有明确记录。如果你真的想要访问静态方法,我能看到的唯一选择是:

class MyProcessor(object):

    @staticmethod
    def process(request):
        # whatever ...


process = MyProcessor.process

然后添加到您的TEMPLATE_CONTEXT_PROCESSORS "com.mysite.apps.myapp.processors.MyProcessor.process"

答案 1 :(得分:0)

你有一个名为MyProcessor.py的文件吗?听起来像Python希望你拥有:

com/mysite/processors/MyProcessor.py