Как я могу разделить класс python между приложениями без его установки? - PullRequest
0 голосов
/ 21 февраля 2020

У меня есть приложение flask, которое обращается к БД через класс, инкапсулирующий доступ к БД. Мне нужно использовать этот же класс за пределами приложения flask для некоторых обычных заданий, которые обращаются к одной и той же базе данных.

/databases/database.db
/website/application/myblueprint/views.py
/website/application/myblueprint/db_class.py
/scripts/log_reading.py

И views.py, и log_reading.py должны использовать db_class.py, но вы я не могу импортировать сверху свой собственный пакет.

  1. Я мог бы сделать db_class.py своим собственным приложением и устанавливать его каждый венв, но затем каждый раз, когда я редактировал, мне приходилось переустанавливать его в каждом месте. Кроме того, есть дополнительные затраты на установку для одного модуля.
  2. Я мог бы поместить файл в python путь к сайту, либо переместив его, либо добавив к пути, но это неправильно, и я не уверен, что будет работать с venvs.
  3. Я мог бы sym ссылку, которая также чувствует себя не так. думаю, это решит мою проблему в любом случае.

1 Ответ

0 голосов
/ 21 февраля 2020

Если вы хотите использовать БД или сессию, вам нужно создать контекст приложения, вне контекста приложения вы не сможете его использовать.

from flask import Flask
from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session, sessionmaker
import os

APP_SETTINGS = os.getenv("APP_SETTINGS", "your config path")

def _create_db_session(self, connection_string):
    engine = create_engine(connection_string)
    session_factory = sessionmaker(bind=self.engine)
    session = scoped_session(session_factory)
    return session

app = Flask(__name__)
app.config.from_object(APP_SETTINGS)
db_url = app.config.get("SQLALCHEMY_DATABASE_URI")
session =_create_db_session(db_url)

#then you can use
# session.query to query database
# session.commit(), session.remove()
# same operations you do normally with DB session
...