2011-06-04 82 views
2

我有一个JSON数据文件,它是我的应用程序(版本控制等)的一部分,我们几个模板,需要在这个文件中的数据正确呈现。将静态JSON传递给Django模板 - 最佳实践?

什么是使这个JSON数据的各种方式的利弊可用的模板?

让我们存储JSON数据作为一个模板,要求模板渲染器生成它的相当简单的选项入手,解析作为JSON,并通过作为模板的上下文参数有关每个需要的视图:

'mydata': simplejson.loads(render_to_string('data/mydata.json')) 

(这似乎有点浪费CPU周期和可能的磁盘访问,请问呈现JSON“模板”至少可以自动缓存?)

还有其他的选择吗?有没有Django的内置功能我很想念这种用例?

回答

1

最简单,最快可能要做的事情就是刚刚解析JSON在views.py实际视图之外:

mydata = simplejson.loads(json_file) 

def foo(request): 
    ... 
    return render(request, 'template.html', {"mydata": mydata}, 
     content_type="application/xhtml+xml") 

JSON的将只在第一时间从观点解析的视图.py文件被请求,随后的请求不会导致它被再次解析。建议您可以交替使用上下文处理器。

+0

最简单的想法往往是最好的,最容易被忽视的:) – dkamins 2011-06-04 03:00:21

+0

@dkamins:注意这需要稍有减慢你启动的缺点。因为它是立即加载加载视图时,它会的该模块也 – Wolph 2011-06-06 00:39:38

+0

@WoLpH没有其他意见第一种观点放缓,它只会拖慢从模块中第一个视图的第一个请求,而且当时”只会减慢微秒,第一个请求会稍微慢一点,因为模块必须反正输入。 – zeekay 2011-06-06 00:54:49

1

如果数据应可在许多/所有页面,比context_processor可能是您最好的解决办法:https://docs.djangoproject.com/en/dev/ref/settings/#std:setting-TEMPLATE_CONTEXT_PROCESSORS

如果你只需要一对夫妇特定页面,比你可以简单地把它传递给像你现在正在做的模板或者制作一个模板标签。

至于节省CPU时间,如果你把它保存在一个ThreadLocal变量比你不必每次都解析它。

+0

请详细说明:“如果你将它存储在一个ThreadLocal变量” ... – dkamins 2011-06-04 02:36:51

+0

@dkamins:你可以在这里找到一个例子:http://code.activestate.com/recipes/302088-thread-local-storage-in -python-24/ 基本上你做一个变量是这样的:'VAR = threading.local()',然后你得到的变量,如果可用,或者如果没有设置它。 – Wolph 2011-06-05 12:28:24

+0

有趣的是,谢谢你指出这一点。 – dkamins 2011-06-05 21:31:49