user1828605
user1828605

Reputation: 1735

How to use database models in Python Flask?

I'm trying to learn Flask and use postgresql with it. I'm following this tutorial https://realpython.com/flask-by-example-part-2-postgres-sqlalchemy-and-alembic/, but I keep getting error.

Cannot import name 'AorticStenosis' from partially initialized module 'models' (most likely due to a circular import)

I understand the problem, but I can't figure out how to fix it. So, I started playing around and try to use the steps by step tutorial on something that I'm working on, but I still get the same problem.

Here's my attempt:

Models.py

from app import db

class AorticStenosis(db.Model):

    __tablename__ = 'wvu-model'
    
    id = db.Column(db.Integer, primary_key=True)
    
    ip_address = db.Column(db.String())
    date_created = db.Column(db.DateTime, default=datetime.utcnow)
    e_prime = db.Column(db.Float())
    
    LVMi = db.Column(db.Float())
    
    A = db.Column(db.Float())
    
    LAVi = db.Column(db.Float())
    
    E_e_prime = db.Column(db.Float())
    
    EF = db.Column(db.Float())
    
    E = db.Column(db.Float())
    
    E_A = db.Column(db.Float())
    
    TRV = db.Column(db.Float())
    
    prediction = db.Column(db.String())


def __init__(self, ip_address, e_prime, LVMi, A, E_e_prime, EF, E, E_A, TRV, prediction):
    print('initialized')
    self.ip_address = ip_address
    self.e_prime = e_prime
    self.LVMi = LVMi
    self.A = A
    self.LAVi = LAVi
    self.E_e_prime = E_e_prime 
    self.EF = EF
    self.E = E
    self.E_A = E_A 
    self.TRV = TRV
    self.prediction = prediction


def __repr__(self):
    return '<id {}>'.format(self.id)

app.py

import os
import ast
import bcrypt
from flask import Flask, redirect, render_template, request, session, url_for
import flask_login
from flask_sqlalchemy import SQLAlchemy
from bigml.deepnet import Deepnet
from bigml.api import BigML
import pickle as pkl
import sklearn


app = Flask(__name__)

if app.config['ENV'] == 'production':
    app.config.from_object('as_config.ProductionConfig')

else: 
    app.config.from_object("config.DevelopmentConfig")

# app.config.from_pyfile('as_config.py')
# app.config.from_object(os.environ['APP_SETTINGS'])
# app.config.from_object('as_config.DevelopmentConfig')
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)

from models import AorticStenosis

login_key = app.config['LOGIN_KEY']
api_key = app.config['API_KEY']
model = app.config['MODEL']

api = BigML(login_key, api_key)
deepnet = Deepnet(model, api=api)
scaler = pkl.load(open("scaler.pkl", "rb"))


@app.route("/", methods=["GET", "POST"])
def home():
    prediction = None
    if request.method == "POST":
        form_data = [
            float(request.form.get("e_prime")),
            float(request.form.get("LVMi")),
            float(request.form.get("A")),
            float(request.form.get("LAVi")),
            float(request.form.get("E_e_prime")),
            float(request.form.get("EF")),
            float(request.form.get("E")),
            float(request.form.get("E_A")),
            float(request.form.get("TRV"))
        ]
        form_data = scaler.transform([form_data])[0]
        
        print(form_data)
        

        prediction = str(deepnet.predict({
            "e_prime": form_data[0],
            "LVMi": form_data[1],
            "A": form_data[2],
            "LAVi": form_data[3],
            "E_e_prime": form_data[4],
            "EF": form_data[5],
            "E": form_data[6],
            "E_A": form_data[7],
            "TRV": form_data[8]
        }, full=True))
        prediction = ast.literal_eval(prediction)
        print(prediction)
        

        ## get ip address from the user
        ip_address = request.environ['REMOTE_ADDR']
        print("ip_address: ", ip_address)

        try:
            aorticStenosis = AorticStenosis(
                    ip_address = ip_address,
                    e_prime = form_data[0],
                    LVMi = form_data[1],
                    A = form_data[2],
                    LAVi = form_data[3],
                    E_e_prime = form_data[4],
                    EF = form_data[5],
                    E = form_data[6],
                    E_A = form_data[7],
                    TRV = form_data[8]
                )

            db.session.add(aorticStenosis)
            db.session.commit()

        except Exception as e:
            print(str(e))



        if prediction["prediction"] == "1":
            prediction["prediction"] = "Low Risk"
            prediction["probability"] = round(
                1 - prediction["probability"], 6)
        elif prediction["prediction"] == "2":
            prediction["prediction"] = "High Risk"
        else:
            prediction["prediction"] = "No prediction was made!"
        return render_template("home.html",
                               prediction=prediction["prediction"],
                               probability=prediction["probability"])
    else:
        return render_template("home.html")


if __name__ == "__main__":
    app.run(host="0.0.0.0", port="8000")

Upvotes: 0

Views: 1245

Answers (1)

charchit
charchit

Reputation: 1522

I made a new file database.py and defined db there.

database.py

from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
def init_app(app):
    db.init_app(app)

app.py

import database
...
database.init_app(app)

models.py

from database import db
...

Upvotes: 2

Related Questions