【问题标题】:Passing static JSON to Django Template - best practices?将静态 JSON 传递给 Django 模板 - 最佳实践?
【发布时间】:2011-09-08 05:17:22
【问题描述】:

我有一个 JSON 数据文件,它是我的应用程序的一部分(版本控制等),我们的一些模板需要此文件中的数据才能正确呈现。

使这些 JSON 数据可用于模板的各种方法的优缺点是什么?

让我们从一个相当简单的选项开始,将 JSON 数据存储为模板,让模板渲染器生成它,将其解析为 JSON,并将其作为模板上下文参数传递给每个需要它的视图:

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

(这似乎有点浪费 CPU 周期和可能的磁盘访问。渲染的 JSON“模板”至少会自动缓存吗?)

还有哪些其他选择?是否有任何我缺少的 Django 内置功能是为这种类型的用例设计的?

【问题讨论】:

    标签: python django json


    【解决方案1】:

    最简单且可能最快的做法是在实际视图之外解析您的views.py 中的json:

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

    json 只会在第一次从 views.py 文件中请求视图时被解析,后续请求不会导致它再次被解析。您可以按照建议交替使用上下文处理器。

    【讨论】:

    • 最简单的想法往往是最好的,也最容易被忽视:)
    • @dkamins:请注意,这会稍微减慢您的启动速度。由于它在加载视图时立即加载,因此也会减慢该模块中其他视图的第一个视图
    • @WoLpH 不,它只会减慢来自模块的第一个视图的第一个请求,即使那样它只会减慢几微秒,第一个请求会稍微慢一些,因为无论如何都必须导入模块。
    • @zeekay:这就是我所说的:“该模块中其他视图的第一个视图”。我不知道您如何估计它“只会减慢几微秒”,但不知道 dkamins 正在谈论多少数据。想详细说明一下吗?
    • @WoLpH 在我的回答中,我指定它会在第一次请求 views.py 中的视图时被解析。我接受了您的评论“它也会减慢该模块中其他视图的第一个视图”,这意味着 views.py 中的每个视图都会在 他们的第一次请求时产生连续的惩罚。我猜我们的意思是一样的?至于解析 JSON 所需的时间,我假设 JSON 相当小,这是真的。在我的系统上解析一个 10kb 的 JSON 文件需要不到 100 微秒。
    【解决方案2】:

    如果数据应该在许多/所有页面上可用,那么context_processor 可能是您的最佳解决方案:https://docs.djangoproject.com/en/dev/ref/settings/#std:setting-TEMPLATE_CONTEXT_PROCESSORS

    如果您只在几个特定页面上需要它,那么您可以像现在一样简单地将它传递给模板,或者用它制作一个模板标签。

    至于节省cpu时间,如果你将它存储在一个线程局部变量中,你就不必每次都解析它。

    【讨论】:

    • @dkamins:你可以在这里找到一个例子:code.activestate.com/recipes/… 基本上你创建一个像这样的变量:var = threading.local() 然后你得到这个变量(如果有的话),或者设置它如果没有。
    猜你喜欢
    • 2014-12-30
    • 2012-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-01
    • 1970-01-01
    相关资源
    最近更新 更多