用于模板渲染的 Twisted Web 服务器中的自定义文件扩展名处理程序

Posted

技术标签:

【中文标题】用于模板渲染的 Twisted Web 服务器中的自定义文件扩展名处理程序【英文标题】:Custom filename extension handler in Twisted webserver for template rendering 【发布时间】:2018-09-15 16:10:28 【问题描述】:

我有一个扭曲的 Web 服务器,其中包含在 htdocs/... 层次结构中提供的静态文件。我想在返回之前将所有 .template 文件传递​​给 mako/jinja,但直接返回非模板化的静态文件。有没有人对最好的方法有任何见解?我想避免将它们放在特定目录中,而是将它们留在自然文件层次结构中。

【问题讨论】:

【参考方案1】:

您可以编写一个“处理器”,然后指导 Twisted Web 使用它。例如,如果您使用twistd web 运行您的网络服务器:

twistd web --processor template=yourlib.JinjaProcessor

如果您不使用twistd web,则可以通过填充代表.template 文件的父目录的twisted.web.static.Fileprocessors 属性来使用此功能。

处理器只是一个可调用对象,它接受 FilePath 并返回 IResource 提供程序。

【讨论】:

这可行,但我不知道如何使 index.html 成为 index.mako(如果存在),因此处理 / 变得不可能 static.File 也有一个 indexNames 属性。 indexNames = ["index.mako"] 可能会这样做(或者如果您愿意,您可以附加该名称而不是替换其他名称)。此外,您可以将 ignoredExts 包含在 ".mako" 中,然后对 index 的请求将找到 index.mako(如果您希望在 URL 中显示明确的索引段)。【参考方案2】:

我尝试使用文件处理器,但最终我继承了 static.File 并覆盖了 render() 方法。唯一的复杂情况是我没有意识到我的类型(MakoFile)会为每个孩子实例化——这有时会导致我失去本地的 mako 上下文。最后我意识到 File 类的每个实例都有一个 Registry() 传下来。

所以我将 Registry 子类化为 MakoRegistry,将我的模板查找和上下文粘贴在那里,并将其推送到***对象中。到目前为止,这是有效的。

【讨论】:

以上是关于用于模板渲染的 Twisted Web 服务器中的自定义文件扩展名处理程序的主要内容,如果未能解决你的问题,请参考以下文章

XCTF-攻防世界CTF平台-Web类——12Web_python_template_injection(SSTI服务器模板注入Flask框架之Jinja2模板渲染引擎)

Class 17 - 2 动态渲染页面爬取 — Splash

[WesternCTF2018]shrine

Web 框架 Flask

Thymeleaf 是一款用于渲染 XML/XHTML/HTML5 内容的模板引擎

Go Web编程实战(10)----模板引擎库text/template包的使用