flask

Бывает, приходится делать сайты на flask, у которых есть пользователи и админы. Чисто для себя решил как-то это стандартизировать и, главное, не терять время, когда такая задача появляется. Цель — в несколько команд получить рабочий сайт у которого есть:

  • Регистрация
  • Email подтверждение
  • Авторизация
  • Выход (logout)
  • Администраторы и роли администраторов
  • Административная, пользовательская и публичная часть сайта
  • Возможность юзера менять пароль
  • Восстановление пароля
  • Локализация для иностранных языков

Скриншоты


Вот что получается из коробки:







Профиль пользователя после авторизации:



Админка на flask-admin:



Установка


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 и вот этот репозиторий. Что было добавлено / изменено:

  1. Добавлена локализация как темплейтов, так и флэш-сообщений. Поддержка языков: (Немецкий, Английский, Испанский, Фарси, Финский, Французский, Итальянский, Датский, Русский, Шведский, Турецкий, Китайский). Если языка нет в списке, то по умолчанию в конфиге русский язык установлен в качестве дефолтного.

    # 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)

  2. Удалил поля имени и фамилии при регистрации. По моему опыту это редко когда требуется, а юзеров раздражает.
  3. Все *.py файлы приведены к стандарту pep-8
  4. Вычищены модули, которые подгружаются, но не используются
  5. Роуты разбиты на 3 части: публичный, админский и пользовательский (public_view.py, members_views.py, про админку ниже)
  6. Добавлен модуль flask_bootstrap и вместе с ним изменены темплейты и показ flash-сообщений

    {% import "bootstrap/utils.html" as utils %} {{ utils.flashed_messages(dismissible=True, container=False) }}

    В файле layout.html.
  7. Добавил админку Flask-Admin (статья на хабре о ней). После нехитрых манипуляций она позволила активировать, деактивировать и удалять юзеров, дала возможность добавления ролей. Плюс работа со статическими файлами (загрузка на сервер, удаление, создание папок и т.д.). Пока без локализации.



    Дружить Flask-Admin и Flask-User не хотели при совместном использовании user_models.py.

    Пришлось для Flask-Admin создать отдельный файл models.py, и я так и не смог разобраться, почему они друг другу мешали.

Комментарии (6)


  1. StViga
    20.02.2018 18:03
    +1

    Интересное и полезное решение.
    Спасибо, потестим.


  1. worldmind
    20.02.2018 22:19

    Правильной дорогой идёте товарищ, доколе все одно и то же тысячи раз будут писать, пора перестать делать типовую работу по многу раз. Даёшь фреймворки высокого уровня!


  1. ademaro
    21.02.2018 10:44

    А почему решили взять flask-user вместо flask-security?


    1. pcdesign Автор
      21.02.2018 11:23

      С flask-user раньше имел уже дело, а flask-security пока не довелось попробовать. Хорошая штука?


  1. PaulD
    21.02.2018 12:16

    На эатпе установки еще необходима инициализация DB: python3 manage.py initdb.


    1. pcdesign Автор
      21.02.2018 12:17

      Спасибо. На гитхабе было написано, а в статье забыл. Добавил.