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