python - python扭曲静态文件中的变量替换

标签 python html twisted twisted.web

如何将扭曲的服务器变量替换为提供的文件资源。

例如,以下代码提供了一个网页,我可以在其中加载 ./templates/index.html :

if __name__ == '__main__':
    var = 'my variable'
    from twisted.web.static import File
    webdir = File("{0}/templates/".format(os.path.dirname(os.path.realpath(__file__))))
    web = Site(webdir)
    reactor.listenTCP(int(os.environ.get('SR_LISTEN_PORT')), web)
    reactor.run()

我希望在基本的 index.html 页面中用变量“var”替换 {{variable}}

因此页面将呈现“我的变量”而不是 hello world。

我怎样才能做到这一点?

最佳答案

看起来您需要一个模板引擎来提供文件,您可以使用 jinja2为了它。在您的情况下,应该使用 static.File 来渲染模板目录和 resource.Resource — 以提供通过 jinja2 渲染的文件:

import os

import jinja2

from twisted.internet import reactor
from twisted.web.resource import Resource
from twisted.web.static import File
from twisted.web.server import Site

template_dir = '{}/templates/'.format(os.path.dirname(os.path.realpath(__file__)))

def render(template_file, context):
    env = jinja2.Environment(loader=jinja2.FileSystemLoader(template_dir))
    return env.get_template(template_file).render(context).encode('utf-8')

class RDirectory(File):
    def getChild(self, name, request):
        if name == '':
            return super(RDirectory, self).getChild(name, request)
        return RFile()

class RFile(Resource):
    isLeaf = True

    def render_GET(self, request):
        data = {'var': 'my variable'}
        return render(request.uri, data)

if __name__ == '__main__':
    web = Site(RDirectory(template_dir))
    reactor.listenTCP(int(os.environ.get('SR_LISTEN_PORT')), web)
    reactor.run()

文件可以是这样的:

<html>
   <head><title>Test</title></head>
   <body>{{ var }}</body>
</html>

请注意,jinja2 渲染是同步操作,它会阻塞twistedreactor。为了避免它,你可以 launch rendering in a thread或者尝试使用内置扭曲 templates但它们并没有提供很多可能性。

关于python - python扭曲静态文件中的变量替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41622387/

相关文章:

python - 当前在 VS Code 中运行 Python 的快捷方式

python - 如何在 PyCharm 中用作 jupyter 笔记本的 python 文件中嵌入 Markdown

javascript - 尝试为 div 中的 para 编写一些 'Show/Hide More Text' 功能

html - CSS 叠加效果

python - Django 中的持久 TCP 连接

python - Tkinter 'label' 小部件 - 换行符随机添加空格

python - 调试 Python fatal error : GC Object already Tracked

php - 有一个图像,当点击到 mySQL 查询的变量时发送信息

python - 带有 subprocess.Popen 的扭曲线程?

python - Twisted 的文档字符串中这些格式的含义是什么?