Se è assolutamente necessario memorizzare l'immagine nel database, allora sì, questo è corretto. In genere, i file vengono archiviati nel filesystem e il percorso viene archiviato nel database. Questa è la soluzione migliore perché il server Web in genere ha un metodo efficiente per servire file dal filesystem, a differenza dell'applicazione che invia grandi quantità di dati dinamicamente.
Per servire l'immagine, scrivere una vista che recuperi i dati dell'immagine e li invii come risposta.
@app.route('/event/<int:id>/logo')
def event_logo(id):
event = Event.query.get_or_404(id)
return app.response_class(event.logo, mimetype='application/octet-stream')
<img src="{{ url_for('event_logo', id=event.id }}"/>
servono Preferibilmente utilizzando il tipo MIME corretto anziché application/octet-stream
.
È anche possibile incorporare i dati di immagine direttamente in html utilizzando un data uri. Questo è non ottimale, poiché i dati vengono inviati ogni volta che la pagina viene sottoposta a rendering, mentre un file immagine può essere memorizzato nella cache dal client.
from base64 import b64encode
@app.route('/event/<int:id>/logo')
def event_logo(id):
event = Event.query.get_or_404(id)
image = b64encode(event.logo)
return render_template('event.html', event=event, logo=image)
<p>{{ obj.x }}<br/>
{{ obj.y }}</p>
<img src="data:;base64,{{ logo }}"/>