Hi there, after finding a solution to my last import error, now things got really weird.
I wanted to add flask-cors to my setup in order to be able to access the API from elsewhere. Now this is the error I get from the error.log:
2023-10-03 19:19:22,611: ***************************************************
2023-10-03 19:19:22,810: Error running WSGI application
2023-10-03 19:19:22,810: ModuleNotFoundError: No module named 'flask_cors'
2023-10-03 19:19:22,811: File "/var/www/phylanx_pythonanywhere_com_wsgi.py", line 16, in <module>
2023-10-03 19:19:22,811: from flask_app import app as application # noqa
2023-10-03 19:19:22,811:
2023-10-03 19:19:22,811: File "/home/phylanx/mysite/flask_app.py", line 4, in <module>
2023-10-03 19:19:22,811: from flask_cors import CORS
2023-10-03 19:19:22,812: ***************************************************
Then, when trying to debugg the issue, I ran the WSGI file from the console, getting this error which I can't make much sense of other than that there is some problem with pickle:
(env) 19:19 ~/mysite $ python -i /var/www/phylanx_pythonanywhere_com_wsgi.py
Traceback (most recent call last):
File "/var/www/phylanx_pythonanywhere_com_wsgi.py", line 16, in <module>
from flask_app import app as application # noqa
File "/home/phylanx/mysite/flask_app.py", line 11, in <module>
loaded_model = joblib.load(file)
File "/usr/local/lib/python3.8/dist-packages/joblib/numpy_pickle.py", line 577, in load
obj = _unpickle(fobj)
File "/usr/local/lib/python3.8/dist-packages/joblib/numpy_pickle.py", line 506, in _unpickle
obj = unpickler.load()
File "/usr/lib/python3.8/pickle.py", line 1212, in load
dispatch[key[0]](self)
KeyError: 61
Please help?
edit: Ok, I realized it has to do with the code itself, which I'll try to figure out but maybe somebody here can give me a pointer anyways...
This is my flask app:
from flask import Flask, render_template, request, jsonify
import joblib
import pandas as pd
from flask_cors import CORS
app = Flask(__name__)
CORS(app, resources={r"/predict": {"origins": "http://localhost:3000"}})
# Load the model from .joblib file
with open("NearestNeighbors_clf.joblib", "rb") as file:
loaded_model = joblib.load(file)
# load the database from .csv file
df = pd.read_csv("../database_Leo.csv")
with open("SentenceTransformer_model.joblib", "rb") as file:
sentence_model = joblib.load(file)
@app.route("/")
def index():
return render_template("index.html")
@app.route("/predict", methods=["POST"])
def predict():
# extract input data from the request
star_rating = float(request.form["star_rating"])
price = float(request.form["price"])
user_input_str = str(request.form["user_input_str"])
# print variables to see if they are picked up correctly from user input
print(star_rating, price, user_input_str)
# create embeddings for user input
user_input_emb = sentence_model.encode(user_input_str).reshape(1, -1)
# make prediction based on user input
distances, indices = loaded_model.kneighbors(user_input_emb)
# flatten indices array to use as index in dataframe
indices = indices.flatten()
# filter the whole dataframe for star rating above the user given value and below given price
df_filtered = df[df.index.isin(indices) & (df.rating > star_rating) & (df.price_level < price)]
# get all data points without values for price level
df_price_nan = df[df.index.isin(indices) & df.price_level.isna()]
# combine both into the output & get ID's to return
recs = list(pd.concat([df_filtered, df_price_nan])["reference"])
return jsonify({"recommendations": recs})
if __name__ == "__main__":
app.run(debug=True)