Django自定义上下文处理器每个请求被调用两次

时间:2009-09-19 03:54:33

标签: django preprocessor django-context

我创建了一个只需要运行的简单自定义上下文处理器 每次请求一次。在放入一些日志挂钩后我发现了它 每个请求被调用两次。

这是一个在文档中遗漏的已知“功能”吗? 它与继承树中的模板数量有关吗? 这是1.03中的错误吗?

6 个答案:

答案 0 :(得分:2)

这不是预期的行为。上下文处理器执行一次each time a RequestContext is instantiated)。在模板继承的情况下,the same context instance is passed up to the parent template,因此不应该导致上下文处理器的另一次执行。您的日志记录是误导性的(请参阅@Vinay Sajip的评论),或者您需要确定代码中的每个请求可能执行额外的RequestContext(您使用包含标记或其他自定义模板标记来呈现模板和实例化RequestContext?)

编辑很抱歉,“包含标记”我的意思是(在一般意义上)某些标记呈现另一个模板,而不是任何使用inclus_tag装饰器的标记。采用上下文的常规包含标签应该只传递现有的上下文对象,而不是实例化新的RequestContext。

您可以尝试的一件事是在您的上下文处理器中放置一个“import pdb; pdb.set_trace()”,在Django dev服务器中运行代码,并在控制台中每次上下文时使用pdb检查堆栈跟踪处理器受到攻击,以查看它的调用位置。

答案 1 :(得分:2)

在我的情况下,使用django debug_toolbar时会出现此错误。为避免这种情况,请尝试发表评论

  

debug_toolbar.middleware.DebugToolbarMiddleware

答案 2 :(得分:1)

我想出了这个问题。如果返回除原始上下文之外的字典,则似乎再次执行上下文处理器。不知道为什么,我不能确定,因为我没有查看底层代码,但在更新了原始上下文并返回后问题消失了。感谢。

答案 3 :(得分:0)

这是在生产网络服务器,Apache等上发生,还是仅在内置开发服务器中发生?我在场合注意到了类似的行为,但我很确定这只是runserver中的一个怪癖。

答案 4 :(得分:0)

希望这会有所帮助:

就我而言,问题是一个模板标签,即:allauth包中的providers_media_js。

尽量不要在上下文处理器中返回任何内容,并查看问题是否仍然存在。然后尝试找出导致此问题的变量。

答案 5 :(得分:0)

供将来参考 - 我的问题是视图函数中的render_to_string,导致上下文处理器执行两次:

comments = render_to_string('comments.html', {'comments': comments_list}, request)

此调用已缓存,因此很难确定问题所在。无论如何,我通过从render_to_string调用中删除请求上下文来解决它,因为在这个特定情况下我不需要它:

comments = render_to_string('comments.html', {'comments': comments_list})

稍后我重构了代码并将render_to_string全部删除,并将代码段直接缓存在模板中。但是在视图函数中使用render_to_string存在合法的情况(例如渲染电子邮件模板),因此这可能会导致一些问题。

相关问题