Почему происходит ошибка "работа вне контекста приложения"?

Как исправить ошибку "Working outside of application context" при добавлении пользователя с использованием миграций в вашем проекте с использованием Flask и SQLAlchemy?
  • 1 мая 2024 г. 9:10
Ответы на вопрос 2
Ошибка "работа вне контекста приложения" происходит, когда код выполняется вне контекста Flask-приложения. В частности, это может происходить при попытке обращения к объектам Flask, таким как request, current_app, g, и т. д., за пределами контекста приложения.

Для исправления этой ошибки при добавлении пользователя с использованием миграций в проекте с использованием Flask и SQLAlchemy, необходимо убедиться, что код выполняется внутри контекста приложения Flask. Для этого можно использовать функцию app.app_context() или with app.app_context():, чтобы создать контекст приложения вокруг кода, который вызывает функции Flask.

Пример исправления ошибки:

```python
from your_flask_app import app, db
from your_flask_app.models import User

def create_user(username, email):
    with app.app_context():
        new_user = User(username=username, email=email)
        db.session.add(new_user)
        db.session.commit()
```

При использовании контекста приложения Flask обеспечивается доступ к объектам Flask внутри функции, что позволяет избежать ошибки "работа вне контекста приложения".
Вообщем такое вот решение, правда кривое: 
from flask import Flask
from app import db
from app.models import User
from flask_sqlalchemy import SQLAlchemy
import os

app = Flask(__name__)
basedir = os.path.abspath(os.path.dirname(__file__))

app.config['SQLALCHEMY_DATABASE_URI'] = os.environ.get('DATABASE_URL') or \
                              'sqlite:///' + os.path.join(basedir, 'app.db')

db = SQLAlchemy(app)

with app.app_context():

    u = User(username='admin', email='[email protected]')
    db.session.add(u)
    db.session.commit()

Правда переменные 'basedir' и 'SQLALCHEMY_DATABASE_URI' были оформлены в config.py
Вообщем insert и select проще делать другими способами.
Похожие вопросы