Ошибка с возвратом результата

Есть модель и отправка модели через фласк. https://gist.github.com/EugeneWenew/5e539e10fd747240bb82cc3271f737f5

app.py

from flask import Flask, render_template, request

import model

app = Flask(__name__)


@app.route("/", methods=['POST', 'GET']))
def index():
    if request.method == "POST":
        case_data = request.form['case_data']
        numbers = case_data.split(' ')
        data = []
        for i in range(len(numbers)):
            data.append(int(numbers[i]))
        result = model.pred_values(data)

    return render_template("index.html", case_result=result)


@app.route("/sub", methods=['POST'])
def submit():
    if request.method == "POST":
        case_data = request.form["case_data"]
    return render_template("submit.html", n=case_data)


if __name__ == "__main__":
    app.run(debug=True)

index.html

<!doctype html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <meta name="viewport" ,
        content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
        <title>ML model deployment</title>
    </head>
    <body>
        <h1>Model deployment</h1>
        <p>Enter data in one line in format [24, 6, 348, 139419] </p>

        <form action="/sub" method="POST">
            <input type="text" name="case_data" placeholder="case data">
            <input type="submit">
        </form>
        <p> Случай </p>
    {{ case_result }}
    </body>
</html>

model.py

import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans


def pred_values(input_data):
    df = pd.read_excel('d:\set.xlsx', header=0)
    df_1 = df.drop(['Персона'], axis=1)
    X = df_1
    StandardScaler().fit_transform(X)
    kmeans = KMeans(init="k-means++", n_clusters=4, n_init=12)
    kmeans.fit(X)
    X_test = pd.DataFrame(input_data)
    X_test = X_test.transpose()
    scaled_test = StandardScaler().fit_transform(X_test)
    predicted_label = kmeans.predict(scaled_test)
    return predicted_label


df_test = [24, 6, 348, 139419]
print(pred_values(df_test))

submit.html

<!doctype html>
  <html lang="en">
  <head>
    <meta charset="UTF-8">
    <meta name="viewport"
    content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Submit</title>
  </head>
  <body>
    <h4>{{ n }}</h4>
  </body>
</html>

Ожидаю окна приема результата, работы модели и выдачи результата в формате "[0]".

Получаю:

UnboundLocalError: local variable 'result' referenced before assignment

    return render_template("index.html", case_result = result)

что не так с определением переменной?


Ответы (1 шт):

Автор решения: CrazyElf

У вас получается ошибка, потому что первоначальное обращение к странице через браузер производится запросом GET и в этом случае переменная result у вас действительно получается не определена, а вы её пытаетесь при этом использовать - подставлять в шаблон.

Проще всего решить эту проблему если разделить обработку получения начальной страницы через GET и обработку запроса POST с данными. Не нужно будет писать лишний if в коде, если разделить эту обработку через параметры декоратора:

@app.route("/", methods=['GET']))
def index():
    return render_template("index.html")

@app.route("/", methods=['POST']))
def getresult():
    case_data = request.form['case_data']
    numbers = case_data.split(' ')
    data = []
    for i in range(len(numbers)):
        data.append(int(numbers[i]))
    result = model.pred_values(data)
    return render_template("index.html", case_result=result)
→ Ссылка