【问题标题】:Load Jinja2 templates from Qt Resource System从 Qt 资源系统加载 Jinja2 模板
【发布时间】:2020-09-09 02:51:02
【问题描述】:

我正在尝试从 Qt 资源系统加载一些 Jinja2 模板。我正在使用 Python 3.8.3、Jinja 2.11.2 和 PyQt 5.15。

问题是我什至无法检测到加载模板的 qrc 路径。 QRC 仅适用于 Qt 类?

Python 代码:

from jinja2 import Environment, FileSystemLoader

file_loader = FileSystemLoader(":/plantillas/")  # Here is my problem, how I should detect the qrc path?
env = Environment(loader=file_loader)
plantilla = env.get_template("base.md")

qrc:

<!DOCTYPE RCC>
<RCC version="1.0">
    <qresource prefix="plantillas">
        <file alias="base.md">plantillas/base.md</file>
    </qresource>
</RCC>

【问题讨论】:

    标签: python python-3.x pyqt5 jinja2 qresource


    【解决方案1】:

    QResource 仅适用于 Qt 世界,因此一个可能的解决方案是使用 Qt 类创建一个加载器:

    qloader.py

    import os
    from collections import abc
    
    from jinja2.loaders import BaseLoader, split_template_path
    from jinja2.exceptions import TemplateNotFound
    
    from PyQt5.QtCore import QDir, QDirIterator, QFile, QFileInfo, QIODevice
    
    
    class QFileSystemLoader(BaseLoader):
        def __init__(self, searchpath, encoding="utf-8", followlinks=False):
            if not isinstance(searchpath, abc.Iterable) or isinstance(searchpath, str):
                searchpath = [searchpath]
    
            self.searchpath = list(searchpath)
            self.encoding = encoding
            self.followlinks = followlinks
    
        def get_source(self, environment, template):
            pieces = split_template_path(template)
            for searchpath in self.searchpath:
                filename = os.path.join(searchpath, *pieces)
    
                f = QFile(filename)
                if not f.exists():
                    continue
                if not f.open(QIODevice.ReadOnly):
                    continue
                contents = f.readAll().data().decode(self.encoding)
                f.close()
    
                dt = QFileInfo(f).fileTime(QFile.FileModificationTime)
    
                def uptodate():
                    return QFileInfo(filename).fileTime(QFile.FileModificationTime) == dt
    
                return contents, filename, uptodate
            raise TemplateNotFound(template)
    
        def list_templates(self):
            found = set()
            for searchpath in self.searchpath:
                d = QDir(searchpath)
                it_flag = QDirIterator.Subdirectories
                if self.followlinks:
                    it_flag |= QDirIterator.FollowSymlinks
                it_filter = QDir.Files | QDir.NoDotAndDotDot | QDir.Hidden | QDir.Readable
                if not self.followlinks:
                    it_filter |= QDir.NoSymLinks
                it = QDirIterator(searchpath, it_filter, it_flag)
                while it.hasNext():
                    it.next()
                    found.add(d.relativeFilePath(it.filePath()))
            return sorted(found)
    
    from qloader import QFileSystemLoader
    
    
    qfile_loader = QFileSystemLoader(":/plantillas/")
    env = Environment(loader=qfile_loader)
    plantilla = env.get_template("base.md")
    

    【讨论】:

      猜你喜欢
      • 2011-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-12
      • 2011-04-26
      • 1970-01-01
      • 1970-01-01
      • 2017-04-20
      相关资源
      最近更新 更多