image.payload.read()
возвращает необработанные данные изображения, и это то, что нам нужно, за исключением того, что мы не хотим помещать их в атрибут src тега IMG.
Что мы хотим, так это использовать необработанные данные изображения как изображение и поместить URL-адрес этого изображения в атрибут src.
Вот один пример того, как это можно сделать с помощью временного файла. И это, скорее всего, то решение, которое вам нужно.
from tempfile import NamedTemporaryFile
from shutil import copyfileobj
tempFileObj = NamedTemporaryFile(mode='w+b',suffix='jpg')
copyfileobj(image.payload,tempFileObj)
tempFileObj.seek(0,0)
А затем подайте файл в представлении
from flask import send_file
@app.route('/path')
def view_method():
response = send_file(tempFileObj, as_attachment=False, attachment_filename='myfile.jpg')
return response
Возможно, можно отправить данные изображения прямо из объекта ImageGridFSProxy и пропустить временный файл, но я не уверен в этом.
----------
Теперь, когда вы сделали свой код, я опубликую так, как я бы это сделал. И как я пытался объяснить. :)
Вот мой app.py.
from flask import Flask, send_file, render_template
import mongoengine as mo
app = Flask(__name__)
c = mo.connection.connect('localhost')
@app.route('/')
def index():
images = MyDoc.objects.all()
return render_template('template.html', images=images)
# Separate view for the images
@app.route('/image/<img_name>')
def image(img_name):
image = MyDoc.objects(file_name=img_name).first()
# This is where the tempfile stuff would have been if it would
# have been needed.
if image:
return send_file(image.payload, mimetype='image')
else:
return "404" # might want to return something real here too
class MyDoc(mo.Document):
file_name = mo.StringField(max_length=255, required=True)
payload = mo.ImageField(required=True)
if __name__ == "__main__":
app.run(debug=True)
И вот шаблон.
<html>
<body>
<div>
This is a body!
<div>
{% if images %}
{% for image in images %}
{{ image.file_name }}
<img src="/image/{{ image.file_name }}" />
I'm an image!<br><br>
{% endfor %}
{% endif %}
</div>
</div>
</body>
</html>
Вся эта штука с tempfile
была ненужной, так как полезная нагрузка могла быть отправлена напрямую с send_file
. Миметип был необходим, чтобы сообщить браузеру, что «это изображение», и браузер должен просто показать его, а не загружать. Это был не as_attachment
, как я подозревал ранее.
Таким образом, нет необходимости сохранять файлы с tempfile
или в каталог, где они будут обслуживаться статически.
person
Sevanteri
schedule
01.02.2015