[PYTHON] Lösen Sie das Problem, dass CSS bei der Entwicklung von Webanwendungen mit Flask nicht berücksichtigt wird

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.

Musterantwort

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

Unzufrieden mit dieser Antwort oder unzufrieden mit Flask's url_for

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.

Auslassungsantwort - ein Beispiel für einen halben Fehler

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.

Auslassungsantwort Nr. 2 Fügen Sie context_processor hinzu

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?

Impressionen

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

Lösen Sie das Problem, dass CSS bei der Entwicklung von Webanwendungen mit Flask nicht berücksichtigt wird
Test.py wird auf dem Webserver in Python3 nicht angezeigt.
[VLC] Wie man mit dem Problem umgeht, dass es während der Wiedergabe nicht im Vordergrund steht
Entwicklung von Webanwendungen mit Flask
Die Entwicklung einer Webanwendung ist noch weit entfernt
Behebt ein Problem, bei dem statische Dateien (CSS, JS, img) nicht geladen werden, wenn DEBUG = False in Django ist.
Versuchen Sie es mit dem Webanwendungsframework Flask
Lösen Sie das maximale Subarray-Problem in Python
[Jinja2] Lösung für das Problem, dass die in der for-Anweisung hinzugefügten Variablen nicht vererbt werden
Das Problem, dass das Bild beim Laden mit PandasTools.LoadSDF nicht in ROMol angezeigt wurde, wurde behoben.
Eine Lösung für das Problem, dass Dateien mit [und] nicht in glob.glob () aufgeführt sind
So lösen Sie das Problem, dass der Anmeldebildschirm unter Ubuntu 19.04 nicht für immer angezeigt wird, da er beim Start beim Logo stoppt
Bis die Webanwendung mit Sakura VPS veröffentlicht wird
Wenn das ausgewählte Objekt in bpy.context.selected_objects nicht zurückgegeben wird
Linux ist in erster Linie so etwas
Suchen Sie den Teil 575 aus Wikipedia in Python
Fordern Sie Problem 5 heraus, das Softwareentwickler in 1 Stunde lösen sollten
Die Geschichte, dass yapf nicht mit vscode funktioniert hat
Über die Angelegenheit, dass Nosetests nicht bestanden werden, wenn __init__.py im Projektverzeichnis erstellt wird
Das Bild wird in der lokalen Entwicklungsumgebung angezeigt, aber das Bild wird nicht auf dem Remote-Server von VPS angezeigt.