Home > database >  Flask- The requested URL was not found on the server
Flask- The requested URL was not found on the server

Time:12-27

I think this is a simple problem but I am kind of stuck here.

I am trying to deploy keras model in Flask. My main propose is to practice api.

But I am getting this error continuously whenever I tried to open given local host id.

Not Found

The requested URL was not found on the server. If you entered the URL manually please check your spelling and try again.

Did I miss anything in my code?

I have mentioned my code below:

from numpy.lib.twodim_base import tri
import pandas as pd
import numpy as np
import flask
from tensorflow.keras.models import load_model
import joblib
import csv
import codecs
import warnings




def warn(*arg, **kwargs):
    pass

warnings.warn = warn

#initialize the flask application

app = flask.Flask(__name__)

#load the pre-trained model

def define_model():
    global model
    model = load_model('./model/anomaly_model.h5')
    return print("Model is loaded")


limit = 10

@app.route("/submit", methods=["POST"])

def submit():
    #initialize the data dictionary that will be returned in the response
    data_out = {}
    #load the data file from our endpoint
    if flask.request.method == "POST":
        #read the data file
        file = flask.request.files['data_file']
        if not file:
            return "No file submitted"
        data = []
        stream, = codecs.iterdecode(file.stream, 'utf-8')
        for row in csv.reader(stream, dialect=csv.excel):
            if row:
                data.append(row)
                
        #convert input data to pandas dataframe
        
        df = pd.DataFrame(data)
        df.set_index(df.iloc[:, 0], inplace=True)
        df2 = df.drop(df.columns[0], axis=1)
        df2 = df2.astype(np.float64)
        
        #normalize the data
        scaler = joblib.load('./data/combined.csv')
        X = scaler.transform(df2)
        X = X.reshape(X.shape[0], 1, X.shape[1])
    
        data_out['Analysis'] = []
        preds = model.predict(X)
        preds = preds.reshape(preds.shape[0], preds.shape[2])
        preds = pd.DataFrame(preds, columns=df2.columns)
        preds.index = df2.index
        
        scored = pd.DataFrame(index=df2.index)
        yhat = X.reshape(X.shape[0], X.reshape[2])
        scored['Loss_mae'] = np.mean(np.abs(yhat - preds), axis=1)
        scored['Threshold'] = limit
        scored['Anomaly'] = scored['Loss_mae'] > scored['threshold']
        print(scored)
    
    #determine of an anomaly was detected
    
    triggered = []
    for i in range(len(scored)):
        temp = scored.iloc[i]
        if temp.iloc[2]:
            triggered.append(temp)
    print(len(triggered))
    if len(triggered) > 0:
        for j in range(len(triggered)):
            out = triggered[j]
            result = {"Anomaly": True, "Value":out[0], "filename":out.name} 
            data_out["Analysis"].append(result)
    else:
        result = {"Anomaly":"No Anomalies Detected"}
        data_out["Analysis"].append(result)
    print(data_out)
        
    return flask.jsonify(data_out)

if __name__ == "__main__":
    print(("* Loading the Keras model and starting the server ...."
          "Please wait until the server has fully started before submitting"))
    define_model()
    app.run(debug=True)

Actually I am new in Flask. This is my first attempt. I also tried to give app.run(host='0.0.0.0') but didn't work for me. Can I get some help???

This is the log from terminal:

* Loading the Keras model and starting the server ....Please wait until the server has fully started before submitting
2021-12-27 16:29:45.158086: I tensorflow/core/platform/cpu_feature_guard.cc:151] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations:  AVX2 FMA
To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.
Model is loaded
 * Serving Flask app 'implimentation' (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: on
 * Running on http://127.0.0.1:5000/ (Press CTRL C to quit)
 * Restarting with stat
* Loading the Keras model and starting the server ....Please wait until the server has fully started before submitting
2021-12-27 16:29:49.283527: I tensorflow/core/platform/cpu_feature_guard.cc:151] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations:  AVX2 FMA
To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.
Model is loaded
Model is loaded
 * Debugger is active!
 * Debugger PIN: 114-980-010
127.0.0.1 - - [27/Dec/2021 16:05:37] "GET / HTTP/1.1" 404 -
127.0.0.1 - - [27/Dec/2021 16:05:38] "GET / HTTP/1.1" 404 -
127.0.0.1 - - [27/Dec/2021 16:05:53] "GET / HTTP/1.1" 404 -
127.0.0.1 - - [27/Dec/2021 16:05:56] "GET / HTTP/1.1" 404 -

Hoping for some help

Thanks

CodePudding user response:

You should try change @app.route("/submit", methods=["POST"]) to @app.route("/", methods=["POST"]). That is, remove the submit. When you run the program, the default location is http://127.0.0.1:5000/, but you are attempting to access http://127.0.0.1:5000/submit.

Either access http://127.0.0.1:5000/submit each time, or remove the submit from the url, which is easier, and access the default location each time.

This answer is fairly similar.

CodePudding user response:

It depends on what you want.

The only route you have is the /submit POST route.

You are getting that error because you are hitting a /(GET) route instead of /submit(POST)

Either add a new route to see your server up and running like so

@app.route("/")
def home():
    return 'home'

or using a tool such as postman, hit the /submit route as a POST request.

Remember also that the port is 5000.

CodePudding user response:

the /submit endpoint is not a regular GET request that you can hit by typing http://localhost:5000/submit.

Its clearly expecting a file upload. Make a dummy frontend with a upload file button, or use Postman to create a Post request with necessary flags to upload a file, and ofcourse, do provide the file path

  • Related