Flask объектов на несколько сеансов, когда они не должны быть - PullRequest
0 голосов
/ 23 ноября 2018

У меня есть похожая проблема для пользователя: Объект SQLAlchemy уже присоединен к сеансу

И я получаю в основном ту же ошибку:

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

Я действительно пытаюсь понять, почему создаются несколько сессий, когда я хочу только одну.У меня есть два файла __init__.py и models.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')

Отодни только эти строки, кажется, я должен быть на одном сеансе.Если нет, как правильно отформатировать код, чтобы уменьшить головную боль и избежать переноса объектов между сеансами?Спасибо!

Редактировать: Решение

Причина, по которой я структурировал свой проект таким образом, заключалась в том, что в нескольких частях документации говорилось, что это правильный шаблон (создание БД внутри вашегофайл моделей, а затем вызов dng.init_app (), чтобы получить его в основной файл).Но я думаю, это была плохая идея.Я подумал, может быть, мне нужно, потому что я не могу, чтобы оба файла ссылались друг на друга.Но чтобы обойти это, я написал метод в главном файле, чтобы получить базу данных, и вызвал функцию импорта для моделей

Мой новый __init__.py: # Инициализировать приложение и такое приложение = Flask ( name.SQLAlchemy (приложение)

# 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 голосов
/ 26 ноября 2018

Причина, по которой я структурировал свой проект таким образом, заключалась в том, что в нескольких частях документации говорилось, что это правильный шаблон (создание db внутри файла моделей, а затем вызов dng.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()

Я думаю, что это более правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...