2016-04-10 1 views
1

Ich habe einen Endpunkt in meiner Kolben-Anwendung, wo ich einige Protokollierung in der DB durchführen und dann eine statische HTML-Datei in der Antwort dienen soll. Der Endpunkt sieht wie folgt aus:Serving Static HTML in Flask während der Durchführung einiger DB-Operationen

@app.route("/man/<os>/<section>/<name>") 

Ich habe Tausende von verschiedenen HTML-Dateien, und es hängt von der URL, die eine von ihnen muss zurückgegeben werden. Ich habe Nginx konfiguriert, um alle statischen Dateien zu bedienen. Aber, ich bin der Umgang mit diesem URLs in Glaskolben, die Protokollierung in der DB zu tun, und das Streaming die HTML-Datei durch das Anfragen-Modul (siehe unten)

host = request.host 
    path = 'man_pages/' + os + '/html' + section + '/' + name + '.html' 
    url = 'http://' + host + url_for('static', filename=path) #TODO don't hardcode the scheme 
    req = requests.get(url, stream=True) 
    return Response(stream_with_context(req.iter_content()), content_type=req.headers['content-type']) 

Dies wird in zwei Anfragen an Nginx resultierende und ich nicht Glaube, dass dies die effizienteste Methode ist, dies zu tun. Gibt es eine Möglichkeit, die DB in der Flask-Anwendung zu loggen und dann Nginx zu verwenden, um die statische HTML-Datei zu bedienen?

Antwort

2

Ja, es ist möglich, es mit nur einer Anfrage zu machen.

Andere Webserver haben die Header und Flask hat integrierte Unterstützung für sie.

Nginx unterstützt diese Kopfzeile nicht, es hat die ähnliche X-Accel-Redirect. Leider Flask does not support it

Sie müssen eine nginx Route zu unterstützen und Flask die X-Accel-Redirect Header zurückgeben.

Werfen Sie einen Blick auf die xsendfile, ich denke, es kann für Sie nützlich sein.

Ich gebe Ihnen keine vollständige Lösung, weil ich denke, dass Sie nur einen Hinweis und einige Hinweise über die X-Accel-Redirect Header benötigen.

Einige andere nützliche Ressourcen:

https://gist.github.com/jessejlt/1306827

http://www.mli.gmu.edu/toz/wordpress/2014/07/31/serving-files-with-flask-behind-nginx-gunicorn/

+1

Danke. Es funktionierte :) –

Verwandte Themen