python - 以不同格式导出数据集

标签 python django rendering

我希望能够根据 url 参数以不同的方式显示数据集。

我的网址类似于/page/{limit}/{offset}/{format}/。

例如:

/page/20/0/xml/ - subset [0:20) in xml
/page/100/20/json/ - subset [20:100) in json

我也希望能够对 csv、text、excel、pdf、html 等执行相同的操作...

我必须能够为不同的格式设置不同的 mimetypes 和内容类型。 对于 XML 应为 application/xhtml+xml,对于 csv - text/plain 等...

在 HTML 模式下,我希望能够将此数据传递到某个模板中(我正在使用 Django)。

我计划使集合看起来像:

dataset = {
    "meta" : {"offset" : 15, "limit" : 10, "total" : 1000},
    "columns" : {"name" : "Name", "status" : "Status", "creation_date" : "Creation Date"}
    "items" : 
        [
            {"name" : "John Smith", "status" : 1, "creation_date" : "2009-06-30 10:10:09"},
            {"name" : "Joe The Plummer", "status" : 2, "creation_date" : "2009-06-30 10:10:09"}
        ]
};

并且输出如下:

CSV 输出:

Name, Status, Creation Date
John Smith, 1, 2009-06-30 10:10:09
Joe The Plummer, 2, 2009-06-30 10:10:09

XML 输出:

<items>
    <item id="1">
        <name>John Smith</name>
        <status>1</status>
        <creation_date>2009-06-30 10:10:09</creation_date>
    </item>
    <item id="2">
        <name>Joe The Plummer</name>
        <status>2</status>
        <creation_date>2009-06-30 10:10:09</creation_date>
    </item>
</items>

所以我认为为每种类型实现了我自己的渲染器 - 例如 XMLRenderer、RSSRenderer、JSONRenderer 等...

if format == "xml":
    context = XMLRenderer().render(data = dataset)

    return HttpResponse(content, mimetype="application/xhtml+xml")
elif format == "json":
    context = JSONRenderer().render(data = dataset)

    return HttpResponse(content, mimetype="text/plain")
elif format == "rss":
    context = RSSRenderer(title="Some long title here", link="/page/10/10/rss/").render(data = dataset)

    return HttpResponse(content, mimetype="application/xhtml+xml")

# few more formats...

else:
    return render_to_response(SOME_TEMPLATE, dataset)

这是正确的方法吗?

最佳答案

我建议让渲染器也了解 mimetype,而不是在调用渲染器的代码中对后者进行硬编码 - 更好地将特定于格式的知识集中在一个地方,因此调用代码将是

content, mimetype = renderer().render(data=dataset)
return HttpResponse(content, mimetype=mimetype)

此外,这对于注册表设计模式来说也是一个很好的机会(大多数 if/elif 的长树都是如此,但是您本质上决定使用哪个对象或类是完美的!-)。所以你要么硬编码一个字典:

format2renderer = dict(
  xml=XMLRenderer,
  rss=RSSRenderer,
  # ...etc...
)

或者甚至更好地让渲染器在启动时将自己注册到字典中,但这可能太先进/难以安排。无论哪种情况,我刚才引用的调用片段之前的内容都将是:

renderer = format2renderer.get(format)
if renderer is not None: ...

None时,您可以应用默认代码。我发现字典查找和多态性比 if/elif 树更容易维护和增强!-)

关于python - 以不同格式导出数据集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1066516/

相关文章:

python - 如何使用 filter() 从包含字符串和数字的列表中删除所有字符串?

python - 一次读取多个 Python pickle 数据,缓冲和换行?

python - Django 优化方法中的循环

android - 是否有比使用 AndroidBitmap_xxx 函数更快的视频渲染解决方案?

python - PyMySQL 频繁读取后抛出 'BrokenPipeError'

python - Python 3.x 和 Python 2.7 中 dict.values() 和 dict.keys() 相等之间的行为不一致

不显示 DirectX 10 原语

java - 如何根据属性的特定值对 JTable 的行进行着色

Django 1.11 PostgreSQL - 每个 session 上的 "SET TIME ZONE"命令

Django channel group_send 无法正常工作