简单的烧瓶主题机制
flask-themer的Python项目详细描述
烧瓶加热机
flask应用程序的简单主题支持。在
Flask Themer的灵感来自于(似乎)废弃的flask-themes项目, 但它是为py3.7+(或带有dataclasses的3.6)从头开始编写的 后端口)。然而,它与烧瓶主题和 不寻求成为。烧瓶匠试图对你如何 实际上,你的项目和它的主题,不需要一个 特定元数据格式/文件。在
烧瓶热释放遵循Semantic Versioning。 烧瓶Themer有100%的测试覆盖率,并且认为低于以下是一个错误 100%。在
安装
从PyPi安装最新版本:
pip install flask-themer
或从github获取最新开发版本:
^{pr2}$快速启动
烧瓶的用法通常是非常基本的,一旦设置好,你可能就不需要了
再碰一次。让我们快速启动。注意我们如何导入render_template
从flask_themer
而不是flask
。在
我们的app.py
如下所示:
fromflaskimportFlaskfromflask_themerimportThemer,render_templateapp=Flask(__name__)themer=Themer(app)@themer.current_theme_loaderdefget_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('/')defhello_world():returnrender_template('hello.html')
在它旁边有一个名为themes
的目录,其中一个名为
default
里面。我们的themes/default/hello.html
如下所示:
Hello world!
就这样!默认情况下,Flask Themer将在
你的项目,并假设其中的所有目录都是主题。你可以
使用THEMER_DEFAULT_DIRECTORY
更改它查找的目录,或指定
模板加载器显式覆盖默认值:
fromflask_themerimportThemer,FileSystemThemeLoaderapp=Flask(__name__)themer=Themer(app,loaders=[FileSystemThemeLoader(app,os.path.join(app.root_path,'also_themes'))])
使用模板中的主题
一旦设置了Flask Themer,theme()
和
theme_static()
(就像烧瓶主题)。这些方法查找当前
活动主题并在该主题中查找给定的路径,返回一个特殊的
Jinja可以用来加载它的路径。在
{% extends theme("base.html") %} {% block header %} {{ super() }} <link rel="stylesheet" href="{{ theme_static("bootstrap.css") }}"> {% endblock %}
主题加载器
{emmem发现主题是什么
有。您可以创建一个自定义加载器来从ZIP文件中获取主题,或者
例如数据库。通常,如果您创建一个新的ThemeLoader
,您还将
需要创建一个新的Jinjatemplate loader以便Jinja知道如何
阅读单个模板。让我们做一个非常小的例子,只加载一个
压缩文件中的单个主题。在
fromzipfileimportZipFilefromflask_themerimportThemeLoader,Themefromjinja2.loadersimportBaseLoader,TemplateNotFoundclassZipFileTemplateLoader(BaseLoader):def__init__(self,*args,archive,**kwargs):super().__init__(*args,**kwargs)self.archive=archivedefget_source(self,environment,template):try:return(self.archive.read(template),None,False)exceptKeyError:raiseTemplateNotFound(template)classZipFileThemeLoader(ThemeLoader):def__init__(self,path_to_zip):self.archive=ZipFile(path_to_zip)@propertydefthemes(self):yieldTheme(name='my_dumb_theme',theme_loader=self,jinja_loader=ZipFileTemplateLoader(archive=self.archive),)defget_static(self,theme,path):returnself.archive.read(path)
为了使用新的装载机,我们更新了之前的示例:
...themer=Themer(app,loaders=[ZipFileThemeLoader('my_dumb_theme.zip')])...
很简单对吧?您可以看到我们如何轻松地创建一个加载程序来加载 从存档文件中加载多个主题,或从 数据库。在
- 项目
标签: