在不应该进行多次会话的烧瓶上

时间:2018-11-23 03:23:54

标签: python session flask

我在这里与用户有类似的问题:SQLAlchemy Object already attached to session

我基本上得到了相同的错误:

'<Link at 0x7f31a785f630>' is already attached to session '1' (this is '15')

我真的想弄清楚为什么只创建一个会话时会创建多个会话。我有两个文件__init__.pymodels.py

来自__init__.py的兴趣线:

from .models import User, draft_new_link_message, load_history, load_messages, db
# Initialize app and such
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///my.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
app.secret_key = 'super secret keyssss'
socketio = SocketIO(app)
db.init_app(app)
app.app_context().push()

...

db.create_all()

来自models.py

db = SQLAlchemy()

class Link(db.Model):
    __tablename__ = 'link'

    id = db.Column(db.Integer, primary_key=True, nullable=False)
    url = db.Column(db.String(500), nullable=False)
    originator_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    originator = db.relationship("User", back_populates='history')

仅从这些方面来看,我似乎应该参加一次会议。如果不是,如何正确设置代码格式以减少麻烦并确保不必在会话之间传输对象?谢谢!

编辑:解决方案

之所以以这种方式构造项目,是因为一些文档说这是正确的模式(在您的模型文件中创建db,然后调用db.init_app()将其放入主文件)。但是我想这是个坏主意。我以为可能不得不这样做,因为我无法让两个文件互相引用。但是要解决这个问题,我在主文件中编写了一个方法来获取数据库,并在模型函数中调用了导入

我的新__init__.py:     #初始化应用程序等     app = Flask(名称)     app.config ['SQLALCHEMY_DATABASE_URI'] ='sqlite:///browse_together.db'     app.config ['SQLALCHEMY_TRACK_MODIFICATIONS'] = True     app.secret_key ='超级秘密密钥'     socketio = SocketIO(应用程序)     db = SQLAlchemy(app)

# Provide a way for models.py (and any other files that needs it) to get access to the database
def get_db():
    return db


# Now you can import models.py because it can use this database
from . import urltils, models
from .models import User, Group, get_groups, create_group, \
    draft_new_link_message, load_history, load_messages, toggle_send

models.py中新的前几行:

from flask_login import UserMixin
from . import urltils
from . import get_db

# Get an instance of the db from __init__
db = get_db()

我认为这更正确。

1 个答案:

答案 0 :(得分:1)

之所以以这种方式构造项目,是因为一些文档说这是正确的模式(在您的模型文件中创建db,然后调用db.init_app()将其放入主文件)。但是我想这是个坏主意。我以为可能不得不这样做,因为我无法让两个文件互相引用。但是要解决这个问题,我在主文件中编写了一个方法来获取数据库,并在模型函数中调用了导入

我的新__init__.py

# Other imports...

# Initialize app and such 
app = Flask(name)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///my.db' 
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True 
app.secret_key = 'super secret keysssss' 
db = SQLAlchemy(app)

# Provide a way for models.py (and any other files that needs it) to get access to the database
def get_db():
    return db


# Now you can import models.py because it can use this database
from . import urltils, models
from .models import User, Group, get_groups, create_group, \
    draft_new_link_message, load_history, load_messages, toggle_send

models.py中新的前几行:

from flask_login import UserMixin
from . import urltils
from . import get_db

# Get an instance of the db from __init__
db = get_db()

我认为这更正确。