循环导入错误(Python Flask Sqlalchemy)

问题描述 投票:0回答:1

当我运行代码时,出现以下错误:

File "c:\Python\app.py", line 3, in <module>
    from user import db, Hasta  # import relevant classes and database from user.py
    ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "c:\Python\user.py", line 6, in <module>
    from app import app  # Import Flask app
    ^^^^^^^^^^^^^^^^^^^
  File "c:\Python\app.py", line 3, in <module>
    from user import db, Hasta  # Import relevant classes and database from user.py
    ^^^^^^^^^^^^^^^^^^^^^^^^^^
ImportError: cannot import name 'db' from partially initialized module 'user' (most likely due to a circular import) (c:\Python\user.py)

即使我的

user.py
app.py
文件位于同一目录中,我也会收到
circular loop import
错误。我尝试了各种方法但找不到它。你能帮助我吗。另外,虽然我研究了这个错误,但我做不到。

随附的代码是我的Python文件:

  1. app.py

    # app.py
    from flask import Flask, render_template, request, redirect, url_for, flash
    from flask_sqlalchemy import SQLAlchemy
    from user import db, Hasta  # import relevant classes and database from user.py
    
    app = Flask(__name__)
    app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db'
    app.config['SECRET_KEY'] = 'your_secret_key_here'
    
    db.init_app(app)
    
    @app.route('/')
    def index():
        return render_template("index.html")
    
    @app.route('/login', methods=['POST'])
    def login():
        username = request.form['username']
        password = request.form['password']
    
        # Here we can use Patient class
        hasta = Hasta.query.filter_by(hasta_username=username, hasta_password=password).first()
    
        if hasta:
            flash('Giriş başarılı', 'success')
            return redirect(url_for('hello'))
        else:
            flash('Kullanıcı adı veya şifre hatalı!', 'error')
            return redirect(url_for('index'))
    
    @app.route('/hello')
    def hello():
        return 'Hello, world!'
    
    if __name__ == "__main__":
        app.run(debug=True)
    
  2. user.py

    # user.py
    from flask_sqlalchemy import SQLAlchemy
    from sqlalchemy import ForeignKey
    from sqlalchemy.orm import relationship
    from datetime import datetime
    
    from app import db  # Import Flask app
    
    class Admin(db.Model):
       admin_id = db.Column(db.Integer, primary_key=True)
       admin_username = db.Column(db.String(50), unique=True, nullable=False)
       admin_password = db.Column(db.String(100), unique=True, nullable=False)
    
       def __init__(self, admin_username, admin_password):
          self.admin_username = admin_username
          self.admin_password = admin_password
    
    class Hasta(db.Model):
       hasta_id = db.Column(db.Integer, primary_key=True)
       hasta_username = db.Column(db.String(50), unique=True, nullable=False)
       hasta_password = db.Column(db.String(100), unique=True, nullable=False)
       hasta_name = db.Column(db.String(25), nullable=False)
       hasta_surname = db.Column(db.String(25), nullable=False)
       hasta_gender = db.Column(db.String(1), nullable=False)
       hasta_birth = db.Column(db.DateTime, nullable=False)
       hasta_tel = db.Column(db.String(16), nullable=False)
       hasta_adres = db.Column(db.String(100), nullable=False)
       hast_admID = db.Column(db.Integer, db.ForeignKey('admin.admin_id'))
       admin = relationship("Admin")
    
    class Doktor(db.Model):
       doktor_id = db.Column(db.Integer, primary_key=True)
       doktor_username = db.Column(db.String(50), unique=True, nullable=False)
       doktor_password = db.Column(db.String(100), unique=True, nullable=False)
       doktor_name = db.Column(db.String(25), nullable=False)
       doktor_surname = db.Column(db.String(25), nullable=False)
       dok_admID = db.Column(db.Integer, db.ForeignKey('admin.admin_id'))
       admin = relationship("Admin")
       dok_hastaID = db.Column(db.Integer, db.ForeignKey('hasta.hasta_id'))
       hasta = relationship("Hasta")
    
    class Randevu(db.Model):
       randevu_id = db.Column(db.Integer, primary_key=True)
       randevu_tar = db.Column(db.DateTime, nullable=False)
       randevu_saat = db.Column(db.Time, nullable=False)
       ran_HastID = db.Column(db.Integer, db.ForeignKey('hasta.hasta_id'))
       hasta = relationship("Hasta")
       ran_DokID = db.Column(db.Integer, db.ForeignKey('doktor.doktor_id'))
       doktor = relationship("Doktor")
    
    class Rapor(db.Model):
       rapor_id = db.Column(db.Integer, primary_key=True)
       rapor_tar = db.Column(db.DateTime, nullable=False)
       rapor_Icer = db.Column(db.String(120), nullable=False)
       rap_hasID = db.Column(db.Integer, db.ForeignKey('hasta.hasta_id'))
       hasta = relationship("Hasta")
       rap_dokID = db.Column(db.Integer, db.ForeignKey('doktor.doktor_id'))
       doktor = relationship("Doktor")
       rap_admID = db.Column(db.Integer, db.ForeignKey('admin.admin_id'))
       admin = relationship("Admin")
    
    # Uygulama bağlamı içinde veri eklemeyi deneyin
    with db.app.app_context():
       # Tablolara veri ekleniyor
       admin1 = Admin(admin_username='ibardo', admin_password='yalova77')
       db.session.add(admin1)
    
       hasta1 = Hasta(hasta_username='gonul', hasta_password='malatya44', hasta_name='Gonul', hasta_surname='Dogan', hasta_gender='K', hasta_birth=datetime(1970, 11, 3), hasta_tel='5356741243', hasta_adres='ZaferMah. Malatya', admin=admin1)
       hasta2 = Hasta(hasta_username='mustafa', hasta_password='yalova77', hasta_name='Mustafa', hasta_surname='Dogan', hasta_gender='E', hasta_birth=datetime(1968, 1, 4), hasta_tel='5325468264', hasta_adres='GocmenMah. Yalova', admin=admin1)
       hasta3 = Hasta(hasta_username='rauf', hasta_password='eskisehir26', hasta_name='Rauf', hasta_surname='Dogan', hasta_gender='E', hasta_birth=datetime(1990, 3, 1), hasta_tel='5359856242', hasta_adres='Tepabasi Eskisehir', admin=admin1)
       db.session.add(hasta1, hasta2, hasta3)
    
       doktor1 = Doktor(doktor_username='pam', doktor_password='scranton', doktor_name='Pam', doktor_surname='Beesly', admin=admin1, hasta=hasta1)
       doktor2 = Doktor(doktor_username='jim', doktor_password='usajim', doktor_name='Jim', doktor_surname='Halpert', admin=admin1, hasta=hasta2)
       doktor3 = Doktor(doktor_username='mike', doktor_password='engmik', doktor_name='Mike', doktor_surname='Scott', admin=admin1, hasta=hasta3)
       db.session.add(doktor1, doktor2, doktor3)
    
       randevu1 = Randevu(randevu_tar=datetime(2024, 9, 8), randevu_saat=datetime(13, 0), hasta=hasta1, doktor=doktor1)
       randevu2 = Randevu(randevu_tar=datetime(2025, 4, 2), randevu_saat=datetime(12, 0), hasta=hasta2, doktor=doktor2)
       randevu3 = Randevu(randevu_tar=datetime(2024, 7, 1), randevu_saat=datetime(16, 0), hasta=hasta3, doktor=doktor3)
       db.session.add(randevu1, randevu2, randevu3)
    
       rapor1 = Rapor(rapor_tar=datetime(2024, 7, 3), rapor_Icer='None', hasta=hasta1, doktor=doktor1, admin=admin1)
       rapor2 = Rapor(rapor_tar=datetime(2024, 5, 2), rapor_Icer='None', hasta=hasta2, doktor=doktor2, admin=admin1)
       rapor3 = Rapor(rapor_tar=datetime(2024, 9, 1), rapor_Icer='None', hasta=hasta3, doktor=doktor3, admin=admin1)
       db.session.add(rapor1, rapor2, rapor3)
    
       db.session.commit()
    

Hasta土耳其语中的意思是患者,我已经使用过多次

python flask sqlalchemy
1个回答
0
投票

您面临的错误(

ImportError: cannot import name 'db' from partially initialized module 'user'
)称为循环导入错误:

  • app
    (
    db
    )
     导入 
    user.py
  • db
    (
    user
    )
     导入 
    app.py

由此我们可以说,当再次从

user
文件中的
db
导入
app.py
时,它会再次进入
app
app.py
文件导入应用程序,这会导致此循环错误

要解决此错误,您需要打破循环,具体方法如下。

  • 创建一个新的Python文件 -

    stating.py
    : 该文件将包含所有初始化内容。

    from flask import Flask
    from flask_sqlalchemy import SQLAlchemy
    
    app = Flask(__name__)
    app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db'
    app.config['SECRET_KEY'] = 'your_secret_key_here'
    
    db = SQLAlchemy(app)
    
  • 更新

    user.py
    :仅更改导入项目,因为我们已将其模式设置为
    stating.py

    更改此:

    from app import db

    对此:

    from stating import db

  • 更新

    app.py
    :由于我们已将
    db
    初始化移至
    stating.py
    ,请将其删除并将导入更改为从新位置导入

    from flask import Flask, render_template, request, redirect, url_for, flash
    from extensions import db
    from user import Hasta
    
    app = Flask(__name__)
    db.init_app(app)
    
© www.soinside.com 2019 - 2024. All rights reserved.