search

Home  >  Q&A  >  body text

python - 在Flask框架中同时使用蓝图与Flask_SQLAlchemy

在Flask框架中同时使用蓝图与Flask_SQLAlchemy遇到了循环导入的问题。

目录结构如下:

.
├── jade_ims
│   ├── __init__.py
│   ├── models.py
│   └── views
│       ├── home.py
│       ├── __init__.py
│       └── install.py
└── run.py

跟代码无关的部分均已去除,run.py只是单纯调用app.run()

jade_ims目录下的__init__.py文件的导入部分如下:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from jade_ims.views.home import home
from jade_ims.views.install import install

models.py的导入部分如下:

from jade_ims import db

views目录下的install.py导入部分如下:

from flask import Blueprint, render_template, g
from jade_ims.models import User

报错提示如下:

Traceback (most recent call last):
  File "/mnt/Data/Code/jade-ims/run.py", line 1, in <module>
    from jade_ims import app
  File "/mnt/Data/Code/jade-ims/jade_ims/__init__.py", line 9, in <module>
    from jade_ims.views.install import install
  File "/mnt/Data/Code/jade-ims/jade_ims/views/install.py", line 2, in <module>
    from jade_ims.models import User
  File "/mnt/Data/Code/jade-ims/jade_ims/models.py", line 1, in <module>
    from jade_ims import db
ImportError: cannot import name 'db'

我的需求时想要在视图中直接操作db进行selectinsert等操作。

全部源码可以在这里找到: https://github.com/Xuanwo/jade-ims

请问是我什么地方搞错了吗?谢谢大家。

巴扎黑巴扎黑2889 days ago342

reply all(1)I'll reply

  • 黄舟

    黄舟2017-04-17 17:53:43

    I just learned flask, just tell me.

    install.py

    from jade_ims import app 
    

    What the hell? Probably the first mistake

    models.py

    from jade_ims import db 
    

    It should be the second mistake. The db instantiation should be placed here. If you put init, init must first register the view blueprint. The view needs to import the db class again. It is a loop. Change it to

    from flask_sqlalchemy import SQLAlchemy
    db = SQLAlchemy()
    

    __init__.py
    You should use factory functions. A lump of instantiation is too ugly

    from flask import Flask
    from werkzeug.utils import import_string
    from config import config
    from models import db
    
    bps = ['jade_ims.views.home:home',
           'jade_ims.views.install:install'
            ]
            
    def create_app():
        app = Flask(__name__)
        app.config.from_object('config')
        db.init_app(app)
        
        for path in bps:
            bp = import_string(path)
            app.register_blueprint(bp)
            
        return app

    reply
    0
  • Cancelreply