Saya mencoba meng-host Server Flask di Heroku. Saya Bekerja dengan Baik Secara Lokal dan memberi saya output yang diinginkan yaitu Daftar Lokasi yang diformat json di sebuah kota. Ketika saya menghostingnya di heroku, itu berhasil dibangun Tapi itu tidak memberi saya output yang saya inginkan.

Tolong Bantu saya Dan buat saya mengerti di mana saya salah

Saat Bekerja Secara Lokal, API memberi saya Tanggapan ini

Panggilan API : http://127.0.0.1:5000/get_location_names_Bangalore

    {
    "locations": [
    "1st block jayanagar",
    "1st phase jp nagar",
    "2nd phase judicial layout",
    "2nd stage nagarbhavi",
    "5th block hbr layout",
    "5th phase jp nagar",
    "6th phase jp nagar",
    "7th phase jp nagar",
    "8th phase jp nagar",
    "9th phase jp nagar",
    "aecs layout",
    "abbigere",
    "akshaya nagar"
   ]
}

Setelah Menyebarkan Server Ke Heroku panggilan API: https://xyz##########.herokuapp.com/get_location_names_Bangalore

{
"locations": null
}

Saya bekerja dengan 2 file bernama server.py dan util.py ....server.py memiliki rute yang diperlukan dan util.py memiliki semua fungsi yang diperlukan

Server.py

from flask import Flask, request, jsonify
import util

app = Flask(__name__)

@app.route('/get_location_names_Bangalore', methods=['GET'])
def get_location_names():
    response = jsonify({
        'locations': util.get_location_names()
    })
    response.headers.add('Access-Control-Allow-Origin', '*')
    
    return response


@app.route('/predict_home_price_Bangalore', methods=['GET','POST'])
def predict_home_price():
    total_sqft = float(request.form['total_sqft'])
    location = request.form['location']
    bhk = int(request.form['bhk'])
    bath = int(request.form['bath'])

    response = jsonify({
        'estimated_price': util.get_estimated_price(location,total_sqft,bhk,bath)
    })
    response.headers.add('Access-Control-Allow-Origin', '*')

    return response

if __name__ == "__main__":
    print("Starting Python Flask Server For Home Price Prediction...")
    util.load_saved_artifacts()
    app.run()

Util.py

import json
import pickle
import numpy as np

__location = None
__data_columns = None
__model = None


def get_estimated_price(location,sqft,bhk,bath):
    try:
        loc_index = __data_columns.index(location.lower())
    except:
        loc_index = -1

    x = np.zeros(len(__data_columns))
    x[0] = sqft
    x[1] = bath
    x[2] = bhk
    if loc_index >= 0:
        x[loc_index] = 1

    return round(__model.predict([x])[0],2)

def get_location_names():
    return __location

def load_saved_artifacts():
    print("Loading saved artifacts")
    global __location
    global __data_columns

    with open("bangalore_columns.json",'r') as f:
        __data_columns = json.load(f)['data_columns']
        __location = __data_columns[3:]


    global __model
    with open("banglore_home_prices_model.pickle",'rb') as f:
        __model = pickle._load(f)

        
if __name__ == "__main__":
    load_saved_artifacts()
    #print(get_location_names())
    #print(get_estimated_price('1st phase jp nagar',1000,3,3))

Persyaratan.txt

Flask==1.1.2
gunicorn==20.0.4
numpy==1.18.1

Profil

web: gunicorn server:app
1
Siddharth 20 November 2020, 15:24

1 menjawab

Jawaban Terbaik

Ini karena Anda telah menambahkan kondisi utama untuk kedua file. Dengan Python, Anda hanya dapat memberi nama satu file sebagai "utama" dan itu harus menjadi titik masuk aplikasi. Dalam kasus Anda, file server.py adalah file utama.

Di file util.py Anda, Panggil fungsi: load_saved_artifacts() di luar loop. Ini akan menyelesaikan masalah.

import json
import pickle
import numpy as np

__location = None
__data_columns = None
__model = None


def get_estimated_price(location,sqft,bhk,bath):
    try:
        loc_index = __data_columns.index(location.lower())
    except:
        loc_index = -1

    x = np.zeros(len(__data_columns))
    x[0] = sqft
    x[1] = bath
    x[2] = bhk
    if loc_index >= 0:
        x[loc_index] = 1

    return round(__model.predict([x])[0],2)

def get_location_names():
    return __location

def load_saved_artifacts():
    print("Loading saved artifacts")
    global __location
    global __data_columns

    with open("bangalore_columns.json",'r') as f:
        __data_columns = json.load(f)['data_columns']
        __location = __data_columns[3:]


    global __model
    with open("banglore_home_prices_model.pickle",'rb') as f:
        __model = pickle._load(f)

        

load_saved_artifacts()
1
Harshana Serasinghe 20 November 2020, 15:13