#python #flask #blueprint
#python #flask #схема
Вопрос:
В приложении Flask (инициализированном в __init__.py
) У меня есть два чертежа — auth
и main
. В auth
проекте я пытаюсь установить некоторую переменную (будет загружена из БД и зависит от current_user.get_id()
), которая должна использоваться в main
проекте в качестве URL-префикса:
auth.py
@auth.route('/login', methods=['POST'])
def login_post():
username = request.form.get('username')
password = request.form.get('password')
user_inst = user.query.filter_by(username=username).first()
if not user_inst or not check_password_hash(user_inst.password, password):
flash('Invalid credentials. Check you input and try again.')
return redirect(url_for('auth.login'))
login_user(user_inst)
g.team_name = 'some_team_name'
#session['team_name'] = 'some_team_name'
# if the above check passes, then we know the user has the right credentials
return redirect(url_for('main.some_func'))
В основном плане это необходимо для получения team_name
переменной:
main = Blueprint('main', __name__, static_folder="static", static_url_path="", url_prefix=g.team_name)
Не могли бы вы, пожалуйста, посоветовать, есть ли правильный способ импортировать переменную из auth
в main
(до ее инициализации) без получения:
RuntimeError: Working outside of application context.
Ответ №1:
Основным решением вашей проблемы является регистрация элементов внутри app.app_context():
И похоже, что это ваш первый проект flask, и это распространенная проблема, связанная со структурой проекта. Прочитайте о шаблоне фабрики приложений Flask и примените его.
your_app/__init__.py
def create_app(app_config):
app = Flask(__name__)
with app.app_context():
from your_app.somewhere import team_name
app.register_blueprint(team_name)
return app
Комментарии:
1. Потрясающе! Большое спасибо!
2. еще один совет: найдите в открытых репозиториях github
flask create_app
и просто скопируйте дизайн проекта))