将 Django 的模板引擎移植到 C
Posted
技术标签:
【中文标题】将 Django 的模板引擎移植到 C【英文标题】:Porting Django's templates engine to C 【发布时间】:2011-02-25 17:07:45 【问题描述】:我最近为我的 C++ 应用程序 (QT) 编写了一个简单而小巧的嵌入式 HTTP 服务器,我玩了一点 Ry's http-parser 并且喜欢它。这家伙疯了。
所以我对自己说:“嘿!为什么不把 django 模板引擎移植到 C 中呢?”那太棒了! 我知道,这不是一件容易的事(一点也不,我知道),但我真的很想实现它。所以我来这里是为了灵感、想法、意见……
我真的很想就这个主题、想法、已经完成的工作、我将遇到的主要问题(以及如何解决它们)提供一些指示 - 如何不重新发明***......无论如何,你明白了:)
一百万次感谢!
附: 非常欢迎使用简单的代码 sn-ps 以及指向工具和库的链接!
P.P.S.我已经知道grantlee,我查看了它的来源。嗯……那是 C++,它是 Qt 特有的。
【问题讨论】:
我刚刚发现了这个github.com/panyam/mango,也许会有所帮助?我仍然不知道它的全部内容,但我正在阅读资料 这是关于将 django 模板移植到 erlang,但至少是关于移植这个特定项目:Write A Template Compiler For Erlang 谢谢你,@MYYN!我想我明白了,这篇文章确实很好! 你还在做这个吗?我很想看看您想出什么并很快将其用作起点。我现在正在使用一些东西,比如 ctypes 中的几个简单的 POSIX 正则表达式来为我做最常见的操作。事实证明,在不离开 cpp 的情况下循环大量替换时速度更快。 发布两年半后这个项目有什么更新吗? 【参考方案1】:嗯,我不明白为什么 django 模板代码中的任何内容都难以在 C 中实现。模板语法看起来有点 Python 风格,但它实际上不是 Python;他们为此实现了自己的解析器。所以首先要看的地方是django template implementation in python。代码真的不多,而且相当容易理解。
当然,C 语言会更加冗长。您正在编写的正是一个编译器:它读入一些代码(django 模板)并用另一种语言(html)写出一些代码。因此,您可以找到所有关于用 C 编写编译器(即标记器 + 解析器 + 代码生成器)的文档都是相关的。
首先,您可能想要生成一个语法树。 django 模板的语法非常规则...每个% whatever %
块都有一个对应的% endwhatever %
块,因此您的解析器实际上可以在不知道所有whatever
关键字可能是什么的情况下生成树。
然后,您遍历树,为每个块执行“代码生成”阶段。例如,您将通过检查 if 参数的值来编码 % if %
,并根据 if 子句是真还是假,打印其内容或不打印任何内容。等等,还有 while 循环、过滤器、块等。
请注意,所有这些工作量很大...您是否考虑过将 python 解释器嵌入到您的 C 程序中? (说真的!这并不难,因为 python 解释器是开源的。)
【讨论】:
谢谢你,apenwarr!这就是我现在正在做的事情。首先编写一个标记器,然后为每个标记编写一个解析器。并组装整个东西。这并不容易,我必须找到一种好方法来声明和使用不同类型变量的上下文。但无论如何这很有趣:)【参考方案2】:如果有用的话,Synth 框架具有在 C++ 中完全独立地重新实现 Django 模板系统的功能。它包括所有built-in tags and filters 以及对自定义的支持;除了库本身之外,还有 Python 绑定,以及本机命令行工具,它可以从 JSON、INI 或 XML 等任意来源读取数据。
【讨论】:
【参考方案3】:作为参考,onion 有一个 Django-link 模板系统。
它将模板编译为 C,甚至允许对它们进行一些 gdb 调试。
生成的代码非常面向洋葱,但通过一些工作它可以更通用。
【讨论】:
【参考方案4】:如果您或其他任何人对 Django 模板引擎的 C++ 实现感兴趣,我正在努力:http://git.fawek.net/Cjango/。不过还没准备好。
【讨论】:
它如何处理自定义模板标签和过滤器? TagNodeFactory 和 FilterFactory 是客户端用来注入自定义功能的两个接口。前者采用工厂函数(针对每个标签名称),每次在模板树中需要它时,它都会分配一个 TagNode 子类的对象。对于后者,您只需将 Filter 对象分配给给定的过滤器名称。以上是关于将 Django 的模板引擎移植到 C的主要内容,如果未能解决你的问题,请参考以下文章
如何在谷歌应用引擎上将帖子从数据库异步加载到 django 模板?