ошибка RuntimeError: Working outside of application context
В базе данных хранятся роли пользователей. При регистрации нужно выбрать роль.Не могу прокинуть список из роута в селект форму
file routes.py
@app.route('/register', methods=['GET', 'POST'])
def register():
...
# query from BD ..... roles = result_query
roles = [(2, 'administrator'), (1, 'operator')]
g.roles = roles
form = RegistrationForm()
file forms.py
class RegistrationForm(FlaskForm):
...
role = SelectField('Role',choices=g.roles, coerce=int) - не работает
#role = SelectField('Role',choices=[(1, 'operator'), (2, 'administrator')], coerce=int) - работает
# roles = db.session.execute(db.select(Role.id, Role.name)).all() - и положить в choices не работает
Не понимаю что не так с контекстом. В роуте g получает значение g.roles и присваивает его(проверил print(). После этого мы создаем инстанс RegistrationForm() где (как я думаю) q.roles должна быть видна. Прочитал все про контексты запроса и приложения, но так и не разобрался.
file init.py
from flask import Flask
from config import Config
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
from flask_login import LoginManager
app = Flask(__name__)
app.config.from_object(Config)
login = LoginManager(app)
login.login_view = 'login'
db = SQLAlchemy(app)
migrate = Migrate(app, db)
from app import routes, models
Ответы (1 шт):
Автор решения: vikvik
→ Ссылка
Работает вот так:
role = SelectField('Role',choices=lambda:[(r.id, r.name) for r in Role.query.all()], coerce=int)
причем если не указать лямбду:
choices=[(r.id, r.name) for r in Role.query.all()]
то выбрасывается вышеуказанная ошибка контекста.