Как и ответ Каспара, но с флагом g, чтобы заменить все вхождения на строку.
find ./ -type f -exec sed -i 's/string1/string2/g' {} \;
Для глобальной нечувствительности к регистру:
find ./ -type f -exec sed -i 's/string1/string2/gI' {} \;
Расширение Flask-SQLAlchemy, как и большинство расширений Flask, должно создаваться за пределами фабрики, а затем инициализироваться на заводе-изготовителе с помощью init_app
. Это значит, что вы можете использовать объект db
до создания приложения.
db = SQLAlchemy()
def create_app():
app = Flask(__name__)
db.init_app(app)
return app
Приложение Flask, как и любой правильно разработанный проект Python, должно быть устанавливаемым пакетом. Это просто сделать: убедитесь, что ваш макет проекта имеет смысл, затем добавьте основной файл setup.py
.
project/
my_flask_package/
__init__.py # at the most basic, this contains create_app and db
setup.py
from setuptools import setup, find_packages
setup(
name='my_flask_package',
version='1.0',
packages=find_packages(),
install_requires=['flask', 'flask-sqlalchemy'],
)
$ python setup.py sdist
Теперь вы можете установить приложение Flask, а также его базы данных, для использования в других проектах. Установите и импортируйте его во виртуальный файл второго проекта, затем создайте и нажмите приложение для его инициализации.
$ pip install my_flask_package-1.0.tar.gz
from my_flask_package import db, create_app
create_app().app_context().push()
db.session.query(...)
Если вы обеспокоены накладными расходами на создание своего приложения, вы можете добавить аргументы к функции create_app
для управления тем, что инициализируется. В большинстве случаев это не должно быть проблемой.
Вы можете легко поделиться. Я покажу, как. Учитывая это приложение Flask:
.
├── config.py
├── db
│ └── test.db
├── do_somenthing2.py ============> Here is run some script 2
├── do_something.py ============> Here is run some script
├── machinelearning
│ ├── models
│ │ ├── restore.py
│ │ ├── train.py
│ │ └── utils.py
│ └── save
│ └── test.ckpt
├── runserver.py ============> Here is run your app
├── test.py
└── web
├── __init__.py
├── api
│ ├── __init__.py
│ ├── app.py ============> Here is app = Flask(__name__)
│ ├── client.py
│ ├── models.py ==========> Here is db = SQLAlchemy(app)
│ ├── sample.json
│ └── utils.py
└── frontend
├── __init__.py
└── routes.py
runningerver.py
import os
from config import DEBUG
from web.api.app import app
from web.api.client import *
if __name__ == "__main__":
app.run(debug=DEBUG)
OK. Теперь вы хотите использовать одни и те же модели для выполнения другой задачи. Например: обучить машину, обслуживать и сохранять в базе данных (ORM), используя те же модели.
Вы можете импортировать приложение и использовать app.test_request_context (). Например:
do_something.py
из web.api.app импортировать приложение из web.api.models import db, user
def do_something():
q = db.session.query(User)\
.filter(User.Name.ilike('Andre'))
for i in q.all():
print (i.Name)
with app.test_request_context():
do_something()
do_something2. py (реальный пример)
from web.api.app import app
from web.api.models import *
def save(df):
passengers = []
records = df.to_dict('records')
for row in records:
p = Passenger(row)
passengers.append(p)
for p in passengers:
db.session.add(p)
db.session.commit()
from ml.models import train, restore
with app.test_request_context():
print ('Trainning model. It will take a while... (~ 5 minutos)')
train.run()
print ('Saving model...')
save(restore.run())
print ('Saved!')
Многие ответы рекомендуют использовать (импортировать файлы из другой папки):
import sys
sys.path.append('../')
Но я не согласен, когда у вас есть приложение Flask и другие скрипты, потому что вы получите сумасшедшее решение относительных ссылок.
Другим вариантом является подход к установке вашего приложения Flask вместе с его базой данных для использования в других проектах.
Здесь вы можете найти документацию о пакетах и модулях .
Пакеты - это способ структурирования пространства имен модулей Python с использованием имен «пунктирных модулей». Например, имя модуля AB обозначает подмодуль с именем B в пакете с именем A. Так же, как использование модулей позволяет авторам разных модулей не беспокоиться об именах глобальных переменных друг друга, использование имен точек в пунктах сохраняет авторов из многомодульных пакетов, таких как NumPy или Pillow, из-за необходимости беспокоиться о именах модулей друг друга.
blockquote>
Для других людей, занимающихся этим направлением. Существует неплохая запись в блоге и ссылка на библиотеку , которая предлагает Flask-SQLAlchemy как преимущества, без прямого связывания SQLAlchemy с Flask.
Однако слово предупреждения; Я пытался использовать Alchy, но все еще не мог понять, как интегрировать его в Flask и не-web-приложение, поэтому я пошел с принятым ответом давидизма на этот вопрос. Ваш пробег может отличаться.
Я столкнулся с той же проблемой.
Если вы включите «SQLALCHEMY_ECHO», вы, вероятно, увидите, что новая транзакция запущена, но отсутствует соответствующий COMMIT / ROLLBACK.
Для того, что я узнал, это имеет какое-то отношение к двум экземплярам SQLAlchemy, которые вы также создаете, один раз в вашем файле модели и один раз на вашем веб-сайте. Скорее всего, это связано с тем, что вы взаимодействуете со своим сеансом web.py, и если вы запрашиваете свои модели, есть какой-то контекст, который будет получать COMMIT.
Я исправил проблему, импортировав «db» из моделей, а затем init это, вызвав db.init_app (приложение). Согласно журналам, фиксация теперь отлично работает.
@app.teardown_appcontext
не требуется, поскольку он настроен в классе SQLAlchemy Flask-SQLAlchemy ( https://github.com/mitsuhiko /flask-sqlalchemy/blob/master/flask_sqlalchemy/init.py)