Бывает, приходится делать сайты на flask, у которых есть пользователи и админы. Чисто для себя решил как-то это стандартизировать и, главное, не терять время, когда такая задача появляется. Цель — в несколько команд получить рабочий сайт у которого есть:
- Регистрация
- Email подтверждение
- Авторизация
- Выход (logout)
- Администраторы и роли администраторов
- Административная, пользовательская и публичная часть сайта
- Возможность юзера менять пароль
- Восстановление пароля
- Локализация для иностранных языков
Скриншоты
Вот что получается из коробки:
Профиль пользователя после авторизации:
Админка на flask-admin:
Получить такой сайт можно двумя вариантами:
I Вариант. С использованием flask-user и SQL-базы данных
Установка и запуск
После этих команд по адресу
Юзер: user@example.com Пароль: Password1.
Админ: admin@example.com Пароль: Password1.
Я запускал и тестировал на linux с версией Python 3.4, но предполагаю, что должно «взлететь» и на любых 3.x.
Ссылка на GitHub.
Образец установки в консоле
Установка
cd ~
# Создаем виртуальное окружение
virtualenv env
# Активируем виртуальное окружение
. env/bin/activate
mkdir -p ~/www/my_app
cd www
git clone https://github.com/Alexmod/Flask-User-and-Flask-admin.git my_app
cd my_app/
# Ставим необходимые модули
pip install -r requirements.txt
# Инициируем базу данных
python manage.py init_db
# Запускаем тесты
py.test tests/
# Если тесты успешно завершились, запускаем сервер
python manage.py runserver
После этих команд по адресу
http://localhost:5000/
должен открыться сайт как на скриншотах.Юзер: user@example.com Пароль: Password1.
Админ: admin@example.com Пароль: Password1.
Я запускал и тестировал на linux с версией Python 3.4, но предполагаю, что должно «взлететь» и на любых 3.x.
Ссылка на GitHub.
Образец установки в консоле
Подробности первого варианта
За основу я взял модуль Flask-User и вот этот репозиторий. Что было добавлено / изменено:
Подробности
За основу я взял модуль Flask-User и вот этот репозиторий. Что было добавлено / изменено:
- Добавлена локализация как темплейтов, так и флэш-сообщений. Поддержка языков: (Немецкий, Английский, Испанский, Фарси, Финский, Французский, Итальянский, Датский, Русский, Шведский, Турецкий, Китайский). Если языка нет в списке, то по умолчанию в конфиге русский язык установлен в качестве дефолтного.
# local_settings.py BABEL_DEFAULT_LOCALE = 'ru'
На русский язык я сделал свою локализацию.
app/translations/ru/LC_MESSAGES/flask_user.po
С flash-сообщениями отлично справился Flask-Babel, а вот чтобы в темплейтах заработал перевод на русский язык строк вида:
{%trans%}Forgot your Password?{%endtrans%} или {{ _('Sign in') }}
Пришлось поваландаться. Добавил:
import gettext
и вот такую функцию:
def set_lang(lang): i18n_dir = app.config['BABEL_TRANSLATION_DIRECTORIES'] gettext.install('lang', i18n_dir) trans_file = i18n_dir + lang + '/LC_MESSAGES/flask_user' tr = gettext.translation(trans_file, 'locale', languages=[lang]) tr.install(True) app.jinja_env.install_gettext_translations(tr)
- Удалил поля имени и фамилии при регистрации. По моему опыту это редко когда требуется, а юзеров раздражает.
- Все *.py файлы приведены к стандарту pep-8
- Вычищены модули, которые подгружаются, но не используются
- Роуты разбиты на 3 части: публичный, админский и пользовательский (public_view.py, members_views.py, про админку ниже)
- Добавлен модуль flask_bootstrap и вместе с ним изменены темплейты и показ flash-сообщений
{% import "bootstrap/utils.html" as utils %} {{ utils.flashed_messages(dismissible=True, container=False) }}
В файле layout.html.
- Добавил админку Flask-Admin (статья на хабре о ней). После нехитрых манипуляций она позволила активировать, деактивировать и удалять юзеров, дала возможность добавления ролей. Плюс работа со статическими файлами (загрузка на сервер, удаление, создание папок и т.д.). Пока без локализации.
Дружить Flask-Admin и Flask-User не хотели при совместном использовании user_models.py.
Пришлось для Flask-Admin создать отдельный файл models.py, и я так и не смог разобраться, почему они друг другу мешали.
II Вариант. С использованием flask-security и MongoDB
Скриншоты
Вот что получается из коробки:
Скриншоты
Вот что получается из коробки:
Установка и запуск
Надеюсь, что у вас уже установлен git, virtualenv и mongoDB.
После этих команд по адресу
Юзер: user@example.com Пароль: Password1.
Админ: admin@example.com Пароль: Password1.
Я запускал на linux с версией Python 3.6, но предполагаю, что должно «взлететь» и на любых 3.x.
Ссылка на GitHub для MongoDB
Установка
Надеюсь, что у вас уже установлен git, virtualenv и mongoDB.
cd ~
# Создаем виртуальное окружение
virtualenv env
# Активируем его
. env/bin/activate
# Создаем папку проекта
mkdir -p ~/www/my_app
cd www
git clone https://github.com/Alexmod/flask-security-flask-admin-mongodb.git my_app
cd my_app
# Ставим все необходимые модули
pip install -r requirements.txt
# Запускаем сервер
python manage.py runserver
После этих команд по адресу
http://localhost:5000/
должен открыться сайт как на скриншотах.Юзер: user@example.com Пароль: Password1.
Админ: admin@example.com Пароль: Password1.
Я запускал на linux с версией Python 3.6, но предполагаю, что должно «взлететь» и на любых 3.x.
Ссылка на GitHub для MongoDB
Деплой первого и второго варианта
Способов деплоя множество. Вот один самый простецкий.
Ставим gunicorn:
pip install gunicorn
В папке my_app создаем новый файл wsgi.py со следующим содержанием:
from app import create_app
app = create_app()
И запускаем:
gunicorn wsgi:app
Если все пройдет без ошибок, то по адресу
http://127.0.0.1:8000
будет сайт, который можно прикручивать к nginx или apache. Дальше настраиваем systemd, чтобы он стартовал автоматически, и не забываем в файле local_settings.py изменить строку:DEBUG = True # Меняем на False