其余API在本地运行良好,但在Herkoku运行不正常



我试图在Heroku上托管一个Flask服务器。我在当地工作得很好,并给了我想要的输出,即json格式的城市位置列表。当我在heroku上托管它时,它已经成功构建了,但它并没有给我想要的输出。

请帮帮我,让我明白我哪里错了

当在本地工作时,API给了我这个响应

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"
]
}

将服务器部署到Heroku之后API调用:https://xyz##########.herokuapp.com/get_location_names_Bangalore

{
"locations": null
}

我正在处理两个名为server.py和util.py的文件…server.py有必要的路由,util.py有所有必要的功能

服务器.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))

Requirement.txt

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

Procfile

web: gunicorn server:app

这是因为您添加了两个文件的主要条件。在Python中,您只能将一个文件命名为">main";并且它应该是应用程序的入口点。在您的情况下,server.py文件是主文件。

在util.py文件中,在循环外调用函数:load_saved_artifacts()。它将解决这个问题。

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()

相关内容

最新更新