Как восстановить переменную admin в приложении на flask-admin?

Как можно связать авторизацию пользователей с приложением flask-admin, чтобы обеспечить доступ только для авторизованных пользователей на странице admin? В приведенном коде в app/index/routes.py возникает ошибка при попытке вернуть объект admin. Как правильно организовать этот процесс?
  • 5 сентября 2024 г. 10:13
Ответы на вопрос 2
Для восстановления переменной `admin` в приложении Flask с использованием Flask-Admin, вам нужно убедиться, что она инициализирована должным образом и связать систему аутентификации пользователей с Flask-Admin. 

В общем, процесс может выглядеть так:

1. **Инициализация Flask-Admin**: Убедитесь, что вы правильно создаете экземпляр `Admin`. Вы можете сделать это в вашем главном приложении.

2. **Авторизация пользователей**: Вам потребуется настроить модель пользователя и систему аутентификации. Это может быть сделано с использованием Flask-Login.

3. **Защита маршрута админ-панели**: Защитите доступ к админке, проверяя, авторизован ли пользователь.

Вот общий пример, как это можно реализовать:

### Шаг 1: Инициализация Flask-Admin

В вашем основном приложении (`app.py` или `app/__init__.py`):

```python
from flask import Flask
from flask_admin import Admin
from flask_login import LoginManager

app = Flask(__name__)
admin = Admin(app, name='My Admin', template_mode='bootstrap3')
login_manager = LoginManager(app)

# Определите конфигурацию инициализации.


@login_manager.user_loader
def load_user(user_id):
    # Загрузите пользователя по user_id (используйте вашу модель пользователя)
    return User.query.get(int(user_id))
```

### Шаг 2: Настройка модели пользователя и аутентификации

Создайте модель пользователя и настройте аутентификацию:

```python
# app/models.py (пример)
from flask_login import UserMixin

class User(db.Model, UserMixin):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(150), nullable=False, unique=True)
    password = db.Column(db.String(150), nullable=False)

# Настройка маршрутов для входа и выхода
@app.route('/login', methods=['GET', 'POST'])
def login():
    # Реализуйте логику входа
    pass

@app.route('/logout')
def logout():
    # Реализуйте логику выхода
    pass
```

### Шаг 3: Защита маршрута админки

Чтобы защитить доступ к админ-панели, используйте декоратор:

```python
from flask import redirect, url_for
from flask_login import current_user

@app.route('/admin')
@login_required  # Декоратор, который проверяет аутентификацию пользователя
def admin_view():
    return redirect(url_for('admin.index'))  # Переход к админке
```

### Шаг 4: Аутентификация в админке

Вы можете переопределить метод `is_accessible`, чтобы ограничить доступ к админке только для авторизованных пользователей:

```python
class MyAdminIndexView(AdminIndexView):
    @expose('/')
    def index(self):
        if not current_user.is_authenticated:
            return redirect(url_for('login'))  # Перенаправление на страницу входа
        return super(MyAdminIndexView, self).index()

# Переопределите стандартный инстанс admin
admin = Admin(app, name='My Admin', template_mode='bootstrap3', index_view=MyAdminIndexView())
```

### Пример полной структуры

Подытоживая вышеизложенное:

```python
from flask import Flask, redirect, url_for
from flask_admin import Admin, expose
from flask_login import LoginManager, current_user, login_required
from models import User  # Импортируйте вашу модель пользователя

app = Flask(__name__)
admin = Admin(app, index_view=MyAdminIndexView())
login_manager = LoginManager(app)

@login_manager.user_loader
def load_user(user_id):
    return User.query.get(int(user_id))

class MyAdminIndexView(AdminIndexView):
    @expose('/')
    def index(self):
        if not current_user.is_authenticated:
            return redirect(url_for('login'))
        return super(MyAdminIndexView, self).index()

# Определение маршрутов для входа и выхода
@app.route('/login', methods=['GET', 'POST'])
def login():
    # Логика для обработки входа пользователя
    pass

@app.route('/logout')
def logout():
    # Логика для выхода пользователя
    pass

if __name__ == '__main__':
    app.run()
```

Таким образом, вы сможете восстановить переменную `admin` и связать авторизацию пользователей с админкой на Flask. Убедитесь, что вся логика аутентификации корректно реализована для обеспечения безопасности вашего приложения.
Вообщем, проще решить вопрос с помощью экосистемы сообщества Pallets: 
https://github.com/pallets-eco/flask-admin/tree/ma...

И потом адаптировать для стационарной работы, например так:
https://github.com/cubinez85/flask-admin_auth
Похожие вопросы