🐈

flaskでの非同期の苦悩

2023/07/09に公開

flaskでサイトを作ろうと苦闘しています。urlでデータを引っ張ってきて、散布図を作るのはできるのですが、その同じ入力画面で新しいurlを入れようとするとエラーになります。その都度flask runを廻さねばなりません。エンドポイントの中の散布図を作る所を非同期にすればよいという意見があり、やっているのですが、いぜんとしてmain thread is not in main loopのエラーが出ます。どうすればよいかご教授願います。エンドポイントのプログラムは以下です。
@app.route('/scatter',methods=["GET","POST"])
def scatter():
if 'url' not in session:
session['url'] = ''

if request.method == 'POST':
    session['url'] = request.form['scatter']
url = session['url']

res = requests.get(url)

soup = BeautifulSoup(res.text, 'html.parser')

省略
for a,b in enumerate(release2):
b = float(b)
d =f'{b/menseki3[a]*3.3:.1f}'
d = float(d)
rent.append(d)

def generate_plot():
    loop = asyncio.new_event_loop()
    asyncio.set_event_loop(loop)
    
    async def plot():
    
        x = years_list
        y = rent

        image = io.BytesIO()
        plt.scatter(x, y)
        plt.title("rent per tsubo on years")
        plt.xlabel("years")
        plt.ylabel("rent per tsubo__scale man_yen")
        plt.savefig(image, format='png')
        image.seek(0)
    
        return base64.b64encode(image.getvalue()).decode('utf=8')
    return loop.run_until_complete(plot())

    
return render_template('scatter.html', image=encoded_image)

Discussion