以django或任何其他方式为全局每请求可用对象创建单例

时间:2011-12-16 12:05:14

标签: python django django-context requestcontext

在开发“小部件”(对象,渲染 - 使用一些自定义的javascript文件)时,我遇到了创建一种“包含脚本管理器”的需要(以避免在多个时包含相同的JS文件)窗口小部件为视图呈现)。

我的第一个想法是编写自定义模板渲染Context,它将在模板中提供EXTRA_SCRIPTS变量。但是我不知道在请求处理期间我应该在哪里收集脚本列表?我认为这就是我需要 singleton 对象的地方。

有什么建议吗?

1 个答案:

答案 0 :(得分:3)

如果您使用单身,则会遇到线程安全问题。例如。您的应用程序在多个线程中运行,一个线程处理单个请求,因此您的全局对象应该是每个线程,但是每个进程的singleton是唯一的。 您可以使用threading.local所述的{{ form.media|add:info_form.media|add:discount_form.media }} 技术。它将为您提供每个线程唯一的对象,因此每个请求。

但不建议这样做,所以不要使用全局变量

对于小部件的情况,Django中的小部件和表单中有媒体设置。 in this question

媒体对象也可以一起添加。添加两个媒体对象时,生成的Media对象包含两个文件中媒体的并集。

所以你可以用媒体来对抗重复。 您也可以将媒体直接组合到模板中

{{1}}