跳转到主要内容

Flask的简单主题机制

项目描述

PyPI PyPI - License GitHub Workflow Status

Flask-Themer

为Flask应用提供简单的主题支持。

Flask-Themer受到了(似乎)被遗弃的flask-themes项目的启发,但它是从头开始为Python 3.8+编写的。然而,它并不立即与flask-themes兼容,也不寻求这样做。Flask-Themer试图对您的项目及其主题的实际结构持中立意见,并且不要求特定的元数据格式/文件。

Flask-Themer的版本遵循语义版本化。Flask-Themer有100%的测试覆盖率,并认为低于100%是错误。

安装

PyPi安装最新版本

pip install flask-themer

或从GitHub获取最新开发版本

git clone https://github.com/TkTech/flask-themer.git
cd flask-themer
python setup.py develop

快速入门

Flask-Themer的使用通常非常简单,一旦设置好,您可能就不需要再接触它了。让我们快速入门。注意我们如何从flask_themer而不是flask导入render_template

我们的app.py看起来像这样

from flask import Flask
from flask_themer import Themer, render_template

app = Flask(__name__)
themer = Themer(app)


@themer.current_theme_loader
def get_current_theme():
    # This is where you would look up the current user's theme if one was
    # logged in, for example.
    return 'default'

@app.route('/')
def hello_world():
    return render_template('hello.html')

旁边有一个名为themes的目录,其中包含一个名为default的目录。我们的themes/default/hello.html看起来像这样

Hello world!

就是这样!默认情况下,Flask-Themer将在您的项目旁边查找一个themes目录,并假设其中的所有目录都是主题。您可以使用THEMER_DEFAULT_DIRECTORY更改它查找的目录,或显式指定模板加载器以覆盖默认设置

from flask_themer import Themer, FileSystemThemeLoader

app = Flask(__name__)
themer = Themer(app, loaders=[
    FileSystemThemeLoader(app, os.path.join(
        app.root_path,
        'also_themes'
    ))
])

从模板使用主题

一旦配置了Flask-Themer,就会添加两个模板全局变量,即theme()theme_static()(与flask-themes类似)。这些方法会查找当前活动的主题,并在该主题中查找给定路径,返回一个Jinja可以使用来加载的特殊路径。

{% extends theme("base.html") %}

{% block header %}
    {{ super() }}
    <link rel="stylesheet" href="{{ theme_static("bootstrap.css") }}">
{% endblock %}

主题也可以使用theme参数扩展其他主题

{% extends theme("base.html", theme="my_parent_theme") %}

主题加载器

主题加载器是Flask-Themer发现可用的主题的机制。您可以从ZIP文件或数据库等创建自定义加载器来获取主题。通常,如果您创建一个新的ThemeLoader,您还需要创建一个新的Jinja 模板加载器,以便Jinja知道如何读取单个模板。以下是一个非常简单的示例,该示例仅从ZIP文件加载单个主题。

from zipfile import ZipFile
from flask_themer import ThemeLoader, Theme
from jinja2.loaders import BaseLoader, TemplateNotFound

class ZipFileTemplateLoader(BaseLoader):
    def __init__(self, *args, archive, **kwargs):
        super().__init__(*args, **kwargs)
        self.archive = archive

    def get_source(self, environment, template):
        try:
            return (self.archive.read(template), None, False)
        except KeyError:
            raise TemplateNotFound(template)


class ZipFileThemeLoader(ThemeLoader):
    def __init__(self, path_to_zip):
        self.archive = ZipFile(path_to_zip)

    @property
    def themes(self):
        yield Theme(
            name='my_dumb_theme',
            theme_loader=self,
            jinja_loader=ZipFileTemplateLoader(archive=self.archive),
        )

    def get_static(self, theme, path):
        return self.archive.read(path)

然后我们更新之前的示例以使用我们新的加载器

...
themer = Themer(app, loaders=[
    ZipFileThemeLoader('my_dumb_theme.zip')
])
...

很简单,对吧?您可以看到我们可以轻松创建一个从存档加载多个主题的加载器,或者从数据库加载用户的自定义主题。

项目详情


下载文件

下载适用于您的平台的文件。如果您不确定要选择哪个,请了解更多关于安装包的信息。

源代码分发

flask-themer-2.0.0.tar.gz (7.0 kB 查看哈希值)

上传时间

构建分发

flask_themer-2.0.0-py3.8.egg (10.1 kB 查看哈希值)

上传时间

flask_themer-2.0.0-py3-none-any.whl (6.9 kB 查看哈希值)

上传时间 Python 3

由以下机构支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面