2016-03-06 2 views
8

In meiner Flask App serviere ich die statischen Assets über die App im dev env, aber ich würde gerne ein CDN in der Produktion verwenden. Jeder Vermögenswert wird in einer Vorlage geladen base.hmtl genannt, so dass ich denke, die einfachste Lösung ist es, eine Variable in der Render-Funktion übergeben und es in der Vorlage verwenden wie:Statische Dateien von einem CDN anstatt von Flask in Produktion servieren

<script src="{{ STATIC_URL }}/js/main.js"></script> 

Normalerweise wäre es eine leere Zeichenfolge in dem Entwickler sein env und die cdn URL in der Produktion. Ich möchte vermeiden, diese STATIC_URL Variable zu jeder Ansicht zu übergeben. Ich könnte es mit

@bp.context_processor 
def set_static_path(): 
    return dict(STATIC_URL='https://foo.bar.com') 

arbeiten lassen Aber das scheint mir ein wenig hacky. Gibt es einen besseren Weg, um dieses Problem zu lösen?

Antwort

12

Sie müssen nicht ändern, wie Sie statische Dateien verknüpfen, Sie können weiterhin url_for('static', filename='myfile.txt') verwenden. Ersetzen Sie die statische Standardansicht durch eine, die zum CDN umleitet, wenn sie konfiguriert ist.

from urllib.parse import urljoin 
# or for python 2: from urlparse import urljoin 
from flask import redirect 

@app.endpoint('static') 
def static(filename): 
    static_url = app.config.get('STATIC_URL') 

    if static_url: 
     return redirect(urljoin(static_url, filename)) 

    return app.send_static_file(filename) 

Ob auf dev Maschine oder sind, dann stellen Sie den STATIC_URL Config-Wert an die CDN und Anfragen für statische Dateien werden dort umgeleitet werden.


Redirects sind relativ billig und werden von Browsern erinnert. Wenn Sie an den Punkt gelangen, an dem die Leistung von ihnen maßgeblich beeinflusst wird, können Sie eine Funktion schreiben, die direkt mit dem CDN verknüpft ist.

@app.template_global() 
def static_url(filename): 
    static_url = app.config.get('STATIC_URL') 

    if static_url: 
     return urljoin(static_url, filename) 

    return url_for('static', filename=filename) 

Die template_global Dekorateur macht die Funktion in allen Vorlagen zur Verfügung. Verwenden Sie es anstelle von url_for, wenn Sie URLs für statische Dateien benötigen.

2

Diese Flasche cdn kann eine Lektüre wert sein. Grundsätzlich können Sie das Flask-CDN extension installieren und Ihre CDN-URL in Ihrer app.py-Datei wie folgt definieren:

Verwandte Themen