воскресенье, 7 апреля 2013 г.

Программа генерации учётных записей на Flask

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

В начале прошлого года я принялся за освоение Perl. Тогда я решил переписать эту веб-страницу на Perl, чтобы поближе познакомиться с модулем HTML::Template.

Теперь я вновь взял для теста эту веб-страницу и решил переписать её на Python, на этот раз для практического ознакомления с веб-фреймворком Flask.

Вспомогательные функции, занимающиеся собственно генерацией логинов и паролей, я вынес в отдельный модуль utils, дабы не перегружать пример. Основной модуль приложения располагается в файле main.py и выглядит следующим образом:
#!/usr/bin/python
# -*- coding: UTF-8 -*-

from flask import Flask, render_template, request

import utils

# Создаём новое приложение Flask
app = Flask(__name__, instance_path = '/home/stupin/flask',
                      instance_relative_config = True)

# Загружаем настройки приложения из файла конфигурации
app.config.from_pyfile('config.cfg')

# Генерация случайного пароля с использованием
# настроек из файла конфигурации
def random_password(length = app.config['PASS_LENGTH'],
                    chars = app.config['PASS_CHARS']):
    return utils.random_password(length, chars)

# Генерация логина, длина которого указана в файле конфигурации
def login(*args, **kwargs):
    if 'max_len' not in kwargs:
        kwargs['max_len'] = app.config['LOGIN_LENGTH']
    return utils.login(*args, **kwargs)

@app.route('/', methods = ['GET'])
def index_get():
    return render_template('index.html', ilogin = 0,
                                         password = random_password())

@app.route('/', methods = ['POST'])
def index_post():
    surname = request.form.get('surname', '')
    name = request.form.get('name', '')
    patronym = request.form.get('patronym', '')
    password = request.form.get('password', random_password())
    ilogin = int(request.form.get('ilogin', 0))

    # Если попросили предыдущий логин, уменьшаем номер логина на единицу
    if 'prevlogin' in request.form:
        ilogin = max(0, ilogin - 1)
    # Если попросили следующий логин, увеличиваем номер логина на единицу
    elif 'nextlogin' in request.form:
        ilogin = max(0, ilogin + 1)
    # Если попросили другой пароль, генерируем новый пароль
    elif 'nextpassword' in request.form:
        password = random_password()
    # Если попросили очистить форму, чистим
    elif 'reset' in request.form:
        surname = ''
        name = ''
        patronym = ''
        ilogin = 0

    return render_template('index.html', surname = surname,
                                         name = name,
                                         patronym = patronym,
                                         ilogin = ilogin,
                                         password = password)
                                         login = login(surname, name, patronym, ilogin),
                                         ilogin = ilogin,
                                         password = password)

# Запуск сервера, если этот модуль был запущен как программа
if __name__ == '__main__':
    app.run(debug = True, host = '127.0.0.1', port = 5000)
И содержимое файла конфигурации config.cfg:
LOGIN_LENGTH = 12
PASS_LENGTH = 8
PASS_CHARS = 'abcdefhkmnpqrstuvwxyzABCDEFHKLMNPQRSTUVWXYZ23456789'
DEBUG = False
Осталось запустить главный модуль в режиме отладки:
$ ./main.py
Получившееся приложение выглядит следующим образом:

Полный архив с приложением можно взять здесь: http://stupin.su/files/flask_account.tbz.

Этот фреймворк привлёк меня в первую очередь своей похожестью на Perl-фреймворк Dancer, который, в своё время привлёк меня лёгкостью, простотой освоения и модульностью (кстати, он очень похож на Mojolicious::Lite). Flask чуть менее модульный и потому чуть более сложный. Положительная сторона заключается в том, что меньше приходится задумываться о выборе и настройке какого-то дополнительного модуля, потому что базовые компоненты уже есть в ядре и они лучше интегрированы между собой. Есть и другие доводы, заставившие меня попробовать этот фреймворк, но до них я пока не добрался и говорить о них сейчас рано.

Комментариев нет: