在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

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

阅读 6.5k
1 个回答

我也是刚学flask,随便说说。

install.py

from jade_ims import app 

什么鬼?应该是第一错

models.py

from jade_ims import db 

应该是第二错 db实例化放这里才对 要是放init init要先注册view蓝图 view又要导入db类 循环了 改之

from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()

__init__.py
应该用工厂函数 一坨实例化太难看

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
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏