使用SQLAlchemy进行Flask Blueprint设置会产生UnboundExecutionError

时间:2014-11-25 04:41:52

标签: python flask

我正在使用Flask使用Blueprint构建实验性应用程序。这是我项目的结构:

-myproject/
 requirements.txt
 run.py
 -apps/
  -static/
  -template/
  -database/
  __init__.py
  views.py
  model.py
  auth.py
  message.py

我在 init .py中启动我的应用,使用蓝图集成应用的其他部分。

app = Flask(__name__)
from .views import views
from .model import model, db
from .auth import auth, login_manager

db.init_app(app)

app.register_blueprint(views)
app.register_blueprint(model)
app.register_blueprint(auth)

然后在views.py

from flask import Flask, request, redirect, render_template, session, g, url_for, Blueprint
views = Blueprint('views', __name__)
from sqlalchemy.orm import scoped_session, relation, sessionmaker

# ORM Session
orm_session = scoped_session(sessionmaker())
@views.route('/courses')
def courses():
    courses = orm_session.query(Course).order_by('-id')
    return render_template('courses.html', courses=courses)

我的Course课程已在model.py中定义:

class Course(db.Model):
    __tablename__ = 'course'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(255), nullable=False)
    subjects = db.relationship('Subject', secondary='course_subject_link')
    students = db.relationship('Student', secondary='course_student_link')
    active = db.Column(db.Boolean)
    def __repr__(self):
        return "<{0}:{1.name}:{1.subjects!r}:{1.students!r}>".format(Course, self)

在模板文件夹中,我在模板文件中添加了{% for course in courses %}{% set active_page = "courses" %}之类的内容。当我运行应用程序时,它给了我这个错误:

UnboundExecutionError: Could not locate a bind configured on mapper Mapper|Course|course, SQL expression or this Session

之前我没有使用Blueprint,所以应用程序曾经能够运行。但在我使用Blueprint之后,网址似乎被打破了。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

我知道问题所在。

从错误消息中的提示我想我忘记了create_engine并使用bind=engine将引擎传递给sessionmaker。

以下是我在views.py中更改的代码:

from os.path import join, dirname 
_cwd = dirname(__file__)
engine = create_engine('sqlite:///' + join(_cwd, 'database/courses.sqlite'))
Session = scoped_session(sessionmaker(autocommit=False,
                                         autoflush=False,
                                         bind=engine))
orm_session = Session()

此处database/courses.sqlite是我的数据库文件的位置。