web-dev-qa-db-fra.com

flask - blueprint - sqlalchemy - impossible d'importer le nom 'db' dans le fichier moles

Je suis nouveau dans bluprint et j'ai un problème avec l'importation de db dans le fichier mydatabase.py qui est un fichier de modèles.

J'ai fait face à cette erreur:

ImportError: impossible d'importer le nom 'db'

L'arbre de mon projet

nikoofar/
    run.py
    bookshelf/
        __init__.py
        mydatabase.py
        main/
            controllers.py
            __init__.py

run.py

from bookshelf import app

if __name__ == '__main__':
    app.run(debug=True, port=8000)

bibliothèque/intit. py

from flask import Flask
from bookshelf.main.controllers import main
from flask_sqlalchemy import SQLAlchemy
from mydatabase import pmenu


app = Flask(__name__, instance_relative_config=True)
db = SQLAlchemy(app)
db.init_app(app)
application.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://username:password@localhost/databasename'

app.config.from_object('config')

app.register_blueprint(main, url_prefix='/')

bibliothèque/main/controllers.py

from flask import Blueprint
from bookshelf.mydatabase import *
from flask_sqlalchemy import SQLAlchemy


main = Blueprint('main', __name__)


@main.route('/')
def index():
    g = pmenu.query.all()
    print (g)
    return "ok"

Le problème remonte à from bookshelf import db, et si je le supprime, l'erreur sera remplacée par:

ImportError: impossible d'importer le nom 'db'

bibliothèque/mydatabase.py

from bookshelf import db

class pmenu(db.Model):
    __tablename__ = 'p_menu'
    id = db.Column(db.Integer, primary_key=True)
    txt = db.Column(db.String(80), unique=True)
    link = db.Column(db.String(1024))
    def __init__(self, txt, link):
        self.txt = txt
        self.link = link
    def __repr__(self):
        return "{'txt': " + self.txt + ", 'link':" + self.link + "}"

Toute solution?

12
niloofar

Il s'agit en fait d'un problème simple, mais frustrant. Le problème est que vous importez le BEFORE principal vous créez l'instance de db dans votre __init__.py

Si vous déplacez l'importation vers après votre db = SQLAlchemy(app), cela fonctionnera:

from flask import Flask

from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://uername:password@localhost/test'

db = SQLAlchemy(app)

from bookshelf.main.controllers import main #<--move this here

app.register_blueprint(main, url_prefix='/')
40
CodeLikeBeaker