Ошибка с возвратом результата
Есть модель и отправка модели через фласк. 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 шт):
У вас получается ошибка, потому что первоначальное обращение к странице через браузер производится запросом 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)