Selaa lähdekoodia

Force client-side purging of CSS/JS when updated.

pull/24/head
Ben Kurtovic 9 vuotta sitten
vanhempi
commit
016742402f
3 muutettua tiedostoa jossa 27 lisäystä ja 5 poistoa
  1. +19
    -0
      app.py
  2. +5
    -2
      templates/api.mako
  3. +3
    -3
      templates/support/header.mako

+ 19
- 0
app.py Näytä tiedosto

@@ -2,9 +2,11 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-


from functools import wraps from functools import wraps
from hashlib import md5
from json import dumps from json import dumps
from logging import DEBUG, INFO, getLogger from logging import DEBUG, INFO, getLogger
from logging.handlers import TimedRotatingFileHandler from logging.handlers import TimedRotatingFileHandler
from os import path
from time import asctime from time import asctime
from traceback import format_exc from traceback import format_exc


@@ -27,6 +29,7 @@ hand = TimedRotatingFileHandler("logs/app.log", when="midnight", backupCount=7)
hand.setLevel(DEBUG) hand.setLevel(DEBUG)
app.logger.addHandler(hand) app.logger.addHandler(hand)
app.logger.info(u"Flask server started " + asctime()) app.logger.info(u"Flask server started " + asctime())
app._hash_cache = {}


def catch_errors(func): def catch_errors(func):
@wraps(func) @wraps(func)
@@ -77,6 +80,22 @@ def close_databases(error):
if g._db: if g._db:
g._db.close() g._db.close()


def external_url_handler(error, endpoint, **values):
if endpoint == "static" and "file" in values:
fpath = path.join(app.static_folder, values["file"])
mtime = path.getmtime(fpath)
cache = app._hash_cache.get(fpath)
if cache and cache[0] == mtime:
hashstr = cache[1]
else:
with open(fpath, "rb") as f:
hashstr = md5(f.read()).hexdigest()
app._hash_cache[fpath] = (mtime, hashstr)
return "/static/{0}?v={1}".format(values["file"], hashstr)
raise error

app.build_error_handler = external_url_handler

@app.route("/") @app.route("/")
@catch_errors @catch_errors
def index(): def index():


+ 5
- 2
templates/api.mako Näytä tiedosto

@@ -1,4 +1,7 @@
<%! from json import dumps %>\
<%!
from json import dumps
from flask import url_for
%>\
<%def name="do_indent(size)"> <%def name="do_indent(size)">
<br /> <br />
% for i in xrange(size): % for i in xrange(size):
@@ -31,7 +34,7 @@
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<title>API - Earwig's Copyvio Detector</title> <title>API - Earwig's Copyvio Detector</title>
<link rel="stylesheet" href="${request.script_root}/static/api.min.css" type="text/css" />
<link rel="stylesheet" href="${request.script_root}$(url_for('static', file='api.min.css')" type="text/css" />
</head> </head>
<body> <body>
% if help: % if help:


+ 3
- 3
templates/support/header.mako Näytä tiedosto

@@ -1,6 +1,6 @@
<%page args="title"/>\ <%page args="title"/>\
<%! <%!
from flask import g, request
from flask import g, request, url_for
from copyvios.background import set_background from copyvios.background import set_background
%>\ %>\
<!DOCTYPE html> <!DOCTYPE html>
@@ -8,9 +8,9 @@
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<title>${title}</title> <title>${title}</title>
<link rel="stylesheet" href="${request.script_root}/static/style.min.css" type="text/css" />
<link rel="stylesheet" href="${request.script_root}$(url_for('static', file='style.min.css')" type="text/css" />
<script src="//code.jquery.com/jquery-1.11.1.min.js" type="text/javascript"></script> <script src="//code.jquery.com/jquery-1.11.1.min.js" type="text/javascript"></script>
<script src="${request.script_root}/static/script.min.js" type="text/javascript"></script>
<script src="${request.script_root}/$(url_for('static', file='script.min.js')" type="text/javascript"></script>
</head> </head>
<% selected = g.cookies["CopyviosBackground"].value if "CopyviosBackground" in g.cookies else "list" %>\ <% selected = g.cookies["CopyviosBackground"].value if "CopyviosBackground" in g.cookies else "list" %>\
% if selected == "plain": % if selected == "plain":


Ladataan…
Peruuta
Tallenna