Flask的简单主题机制
项目描述
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')
])
...
很简单,对吧?您可以看到我们可以轻松创建一个从存档加载多个主题的加载器,或者从数据库加载用户的自定义主题。
项目详情
下载文件
下载适用于您的平台的文件。如果您不确定要选择哪个,请了解更多关于安装包的信息。