You have to separate the HTML and the image into two different routes.
Your /images/<cropzonekey>
route will just serve the page, and in the HTML content of that page there will be a reference to the second route, the one that serves the image.
The image is served in its own route from a memory file that you generate with savefig()
.
I obviously didn’t test this, but I believe the following example will work as is or will get you pretty close to a working solution:
@app.route('/images/<cropzonekey>')
def images(cropzonekey):
return render_template("images.html", title=cropzonekey)
@app.route('/fig/<cropzonekey>')
def fig(cropzonekey):
fig = draw_polygons(cropzonekey)
img = StringIO()
fig.savefig(img)
img.seek(0)
return send_file(img, mimetype="image/png")
Your images.html
template the becomes:
<html>
<head>
<title>{{ title }} - image</title>
</head>
<body>
<img src="https://stackoverflow.com/questions/20107414/{{ url_for("fig', cropzonekey = title) }}" alt="Image Placeholder" height="100">
</body>
</html>