我已经实现了自己的上下文处理器,我正在尝试在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
”这样的路径应该独立于类或标准“子模块”来解决......你不同意吗?
答案 0 :(得分:2)
Django不知道.
是否表示该包中的子包或变量。
因此,foo.bar.baz.quux
假设foo
,bar
,baz
都是包,而quux
(即最后一个值)是该模块的属性
TEMPLATE_CONTEXT_PROCESSORS
最终导出的值由django.template.context.get_standard_processors
(source 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