ошибка 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()]

то выбрасывается вышеуказанная ошибка контекста.

→ Ссылка