ユーザのリクエストに応じてグラフを生成して返すPython webアプリ

# coding=utf-8

from sanic import Sanic
from sanic import response
import jinja2_sanic
import jinja2
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import io
import base64
import numpy as np
import asyncio


app = Sanic("sanic_jinja2_render")

template="<html><head></head><body><h1>{{graph_title}}</h1>" \
         "<div><img src='{{graph}}'> </div></body></html>"
jinja2_sanic.setup(
    app,
    loader=jinja2.DictLoader(
        {
            "templates.jinja2": template
        }
    )
)

@app.route("/")
async def func(request):
    return response.html("# /point_num で散布図を作成")

def draw_graph(point_num):
    img = io.BytesIO()

    # 乱数を生成
    x = np.random.rand(point_num)
    y = np.random.rand(point_num)

    # 散布図を描画
    plt.scatter(x, y)
    plt.savefig(img, format='png')
    plt.close()
    img.seek(0)

    plot_url = base64.b64encode(img.getvalue()).decode()
    graph = 'data:image/png;base64,{}'.format(plot_url)
    return graph

@app.route('/<number>')
@jinja2_sanic.template("templates.jinja2")
async def show_user_network(request, number):

    graph = draw_graph(int(number))

    return {
        "graph_title":  number,
        "graph": graph,
    }


if __name__ == "__main__":
    loop = asyncio.get_event_loop()
    app.run(host="127.0.0.1", port=8000, debug=True)
    try:
        loop.run_forever()
    except:
        loop.stop()