0

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")
4
  • Could you post the code you got so far? Commented Jun 14, 2021 at 20:25
  • @blazej, sure. I've added the code that I was playing around with. Thanks Commented Jun 14, 2021 at 20:28
  • You are getting an error Cannot import name 'Result' from partially initialized module 'models' (most likely due to a circular import) but I can't see in your code try of importing Result model Commented Jun 14, 2021 at 20:36
  • @blazej, Sorry, that was from the original tutorial that I was working on. I had changed that to AorticStenosis Commented Jun 15, 2021 at 0:54

1 Answer 1

2

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
...
Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.