Ich entwickle eine Web-App mit Flask. Zu dieser Zeit habe ich darüber nachgedacht, wie ich mit dem Problem umgehen soll, dass CSS im Webbrowser zwischengespeichert wird.
Beim Verknüpfen von CSS in HTML können das Änderungsdatum und die Änderungsversion manuell hinzugefügt werden, z. B. "style.css? V = 12". Da ich jedoch Python verwende, möchte ich, dass Sie dies automatisch lösen.
Nach der Suche lautet die Antwort des Modells, dass Sie url_for wie folgt umschreiben sollten.
app.py
@app.context_processor
def override_url_for():
return dict(url_for=dated_url_for)
def dated_url_for(endpoint, **values):
if endpoint == 'static':
filename = values.get('filename', None)
if filename:
file_path = os.path.join(app.root_path,
endpoint, filename)
values['q'] = int(os.stat(file_path).st_mtime)
return url_for(endpoint, **values)
Verknüpfen Sie in der Vorlage wie folgt
hoge.html
<link rel= "stylesheet" type= "text/css"
href= "{{ url_for('static',filename='style.css') }}">
Eine Technik, die url_for im Kontextprozessor überschreibt. Die Technik besteht darin, das Änderungsdatum der Datei hinzuzufügen, wenn für den Endpunkt statisch angegeben ist.
Das Folgende ist übrigens die englische Seite der Originalgeschichte. Es wurde in anderen Blogs in Japan in Bezug darauf eingeführt. (Referenz) https://stackoverflow.com/questions/21714653/flask-css-not-updating
Wie ich jedoch immer denke, ist die Verwendung von url_for lang, wenn Sie nur einen statischen Link schreiben. Es ist ein Ärger. In Flask wird die statische Datei standardmäßig unter / static
platziert, daher sollte der Pfad zum Platzieren des CSS bereits festgelegt sein. Mit anderen Worten, die Verwendung von url_for beim Einbetten einer statischen Datei ist ziemlich ärgerlich.
Also habe ich Ecken geschnitten und über die folgende Methode nachgedacht.
Der erste Weg ist die Verwendung eines Filters.
app.py
@app.template_filter('staticfile')
def staticfile_filter(fname):
path = os.path.join(app.root_path, 'static', fname)
mtime = str(int(os.stat(path).st_mtime))
return '/static/' + fname + '?v=' + str(mtime)
Schreiben Sie die Vorlage wie folgt.
hoge.html
<link rel="stylesheet" type="text/css"
href="{{ 'style.css' | staticfile }}">
Es war viel eleganter als die Antwort des Modells.
Bei dieser Methode wird der HTML-Code jedoch von der Vorlagen-Engine zwischengespeichert, sodass das Problem darin besteht, dass der Cache nicht sofort aktualisiert wird. Trotzdem sieht es aus wie style.css? V = xxx.
Immerhin habe ich darüber nachgedacht, die Modellantwort zu kauen und context_processor zu verwenden.
app.py
@app.context_processor
def add_staticfile():
def staticfile_cp(fname):
path = os.path.join(app.root_path, 'static', fname)
mtime = str(int(os.stat(path).st_mtime))
return '/static/' + fname + '?v=' + str(mtime)
return dict(staticfile=staticfile_cp)
Und die Vorlage sieht so aus
hoge.html
<link rel="stylesheet" type="text/css"
href="{{ staticfile('style.css') }}">
In diesem Fall wird es nicht zwischengespeichert, der Wert wird sofort wiedergegeben und es sieht nicht so schlecht aus. Ist es in Ordnung?
Die Kombination von Flask + jinja2 ist einfach zu bedienen und leicht zu erweitern, also gefällt es mir. Die erhaltenen Ergebnisse sind wie folgt.
Recommended Posts