Skip to content
Snippets Groups Projects
Commit f9b821aa authored by Martin Mareš's avatar Martin Mareš
Browse files

Obecný modul na správu verzovaných statických souborů

Pokusil jsem se napsat ho jako flaskovou extension, aby se dal používat
i v jiných projektech.
parent c7625b7d
No related branches found
No related tags found
1 merge request!26Verzování statických souborů
This commit is part of merge request !26. Comments created here will be created in the context of that merge request.
# mo.ext does nothing by itself
pass
# Flask extension for versioned assets
from flask import send_from_directory
import hashlib
import os
from typing import Sequence, Dict
class Assets:
asset_dir: str
asset_dict: Dict[str, str]
url_prefix: str
def __init__(self, app, url_prefix: str, asset_dir: str):
self.app = app
if app is not None:
self.init_app(app, url_prefix, asset_dir)
def init_app(self, app, url_prefix: str, asset_dir: str):
self.asset_folder = asset_dir
self.asset_dict = {}
self.url_prefix = url_prefix
self.app = app
app.jinja_env.globals.update(asset_url=lambda name: self.asset_url(name))
app.assets = self
# This is usually needed only for development, production requests are handled by upstream proxy
app.add_url_rule(
url_prefix + "/<version>/<path:name>",
endpoint="assets",
view_func=lambda version, name: self.send_asset(name),
)
def add_asset(self, name: str):
if name in self.asset_dict:
return
file_name = os.path.join(self.asset_folder, name)
digest = hashlib.sha1()
with open(file_name, 'rb') as file:
while True:
block = file.read(4096)
if not block:
break
digest.update(block)
version = digest.hexdigest()[:8]
self.app.logger.debug(f'Assets: Loaded {name}: version {version}')
self.asset_dict[name] = version
def add_assets(self, names: Sequence[str]):
for name in names:
self.add_asset(name)
def asset_url(self, name: str) -> str:
assert name in self.asset_dict
return os.path.join(self.url_prefix, self.asset_dict[name], name)
def send_asset(self, name: str):
return send_from_directory(self.asset_folder, name)
...@@ -6,7 +6,7 @@ setuptools.setup( ...@@ -6,7 +6,7 @@ setuptools.setup(
name='osmo', name='osmo',
version='0.1', version='0.1',
description='Odevzdávací systém Matematické olympiády', description='Odevzdávací systém Matematické olympiády',
packages=['mo', 'mo/jobs', 'mo/web'], packages=['mo', 'mo/ext', 'mo/jobs', 'mo/web'],
scripts=[ scripts=[
'bin/add-role', 'bin/add-role',
'bin/create-contests', 'bin/create-contests',
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment