Simple theme mechanism for Flask
Project description
Flask-Themer
Simple theme support for flask apps.
Flask-Themer is inspired by the (seemingly) abandoned flask-themes project, but has been written from scratch for py3.7+ (or 3.6 with the dataclasses backport). However it is not compatible immediately compatible with flask-themes and does not seek to be. Flask-Themer tries to have little opinion on how you actually structure your project and its themes.
Flask-Themer releases follow Semantic Versioning. Flask-Themer has 100% test coverage and considers it an error to fall below 100%.
Installation
Install the latest release from PyPi:
pip install flask-themer
or get the latest development version from github:
git clone https://github.com/TkTech/flask-themer.git
cd flask-themer
python setup.py develop
Quickstart
Flask-Themer usage is usually very basic, and once setup you likely won't need
to touch it again. Lets do a quickstart. Notice how we import render_template
from flask_themer
instead of flask
.
Our app.py
looks like this:
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')
And next to it we have a directory called themes
with a directory called
default
inside of it. Our themes/default/hello.html
looks like this:
Hello world!
That's it! By default Flask-Themer will look for a themes
directory next to
your project and assume all the directories inside of it are themes. You can
change what directory it looks for with THEMER_DEFAULT_DIRECTORY
, or specify
the template loaders explicitly to overwrite the default:
from flask_themer import Themer, FileSystemThemeLoader
app = Flask(__name__)
themer = Themer(app, loaders=[
FileSystemThemeLoader(app, os.path.join(
app.root_path,
'also_themes'
))
])
Using Themes From Templates
Two template globals are added once Flask-Themer is setup, theme()
and
theme_static()
(just like flask-themes). These methods look up the currently
active theme and look for the given path in that theme, returning a special
path that Jinja can use to load it.
{% extends theme("base.html") %}
{% block header %}
{{ super() }}
<link rel="stylesheet" href="{{ theme_static("bootstrap.css") }}">
{% endblock %}
Theme Loaders
Theme loaders are the mechanism by which Flask-Themer discovers what themes
are available. You can create a custom loader to get themes from a ZIP file, or
a database for example. Usually if you create a new ThemeLoader
you'll also
need to create a new Jinja template loader so Jinja knows how to
read individual templates. Lets do a very minimal example that loads just a
single theme from a ZIP file.
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)
def themes(self):
return {'my_dumb_theme': 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)
And then to use our new loaders we update our previous example:
...
themer = Themer(app, loaders=[
ZipFileThemeLoader('my_dumb_theme.zip')
])
...
Pretty simple right? You can see how we could easily create a loader to load multiple themes from an archive, or load a user's customized theme from a database.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
File details
Details for the file flask-themer-1.2.0.tar.gz
.
File metadata
- Download URL: flask-themer-1.2.0.tar.gz
- Upload date:
- Size: 5.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.41.1 CPython/3.7.5
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 9bdbf774c0799a67e8da984fbdd14b53f62589ca07c4562a44f3593c4cef5389 |
|
MD5 | caced4603f6e1388d2f4b27cd127fc2d |
|
BLAKE2b-256 | 3402e52376cbe4f5bfcf90143b35d911f2fd50c1489657f725499bde2aede57c |
File details
Details for the file flask_themer-1.2.0-py3.7.egg
.
File metadata
- Download URL: flask_themer-1.2.0-py3.7.egg
- Upload date:
- Size: 9.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.41.1 CPython/3.7.5
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | eece60ed5a0fa70884ffbde97d54a4213d7946b44353856d0fc3d90c47fee374 |
|
MD5 | 2df54dbac297d2074a2e08f6c375f0b6 |
|
BLAKE2b-256 | c7796a3d566944851307a02c283e79858fb84bb657c47a3fdc582f5863522d3b |
File details
Details for the file flask_themer-1.2.0-py3-none-any.whl
.
File metadata
- Download URL: flask_themer-1.2.0-py3-none-any.whl
- Upload date:
- Size: 6.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.41.1 CPython/3.7.5
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 33f7a407c7d929e4c5f960c66b8a9969f2f94ba1a0616eeb0e15b1952e53af10 |
|
MD5 | ce942733a36217fa594350c818a6be76 |
|
BLAKE2b-256 | a94e1fc0394dec26a42d85f53a46147695563c8d9e5956fd0acdff0d20080bd7 |