У меня имеется некий класс Application, в котором внутри определен ряд объектов, описывающих непосредственно само приложение: набор роутов + вьюшки для них. Естественно сделать еще поддержку middlewar'ов, чтобы до вызова нужного обработчика для запроса, выполнить ряд действий по предобработке (например, токен проверить/добавить). Для этих middlewar'ов мне нужна инициализация, которая бы, например, брала или пользовательские настройки (если определены), либо дефолтовые, которые я укажу (например хранить где-нибудь в памяти токены, если пользователь не хочет хранить в БД (или не указал)).
Вопрос в том, как решить красиво и элегантно данную задачу? У меня пока пришло в голову:
1) Пробрасывать аргументы пришедшие в Application класс, а от него, внутрь, в глубину (то есть все конструкторы имеют сигнатуру:
def __init__(self, *args, **kwargs):
# берем какие-то настройки из аргументов/словаря и делаем нужное
....
что на текущий момент времени сделано, но не сказать что абсолютно меня полностью удолетворяет.
2) Сделать нечто наподобие механизма настроек как в Django (имеются какие-то дефолтовые настройки + пользовательские). Вроде бы и круто, но тогда надо и писать свой скрипт, через который пользователь будет ранить свой скрипт (опять же, как джанге), вместо того, чтобы просто запустить у себя скрипт, в котором есть:
if __name__ == '__main__':
cmd = CommandLine()
cmd.define('-ip', default='127.0.0.1', help='used ip', type=str)
cmd.define('-port', default=8080, help='listened port', type=int)
args = cmd.parse_command_line()
app = Application()
app.run(ip=args.ip, port=args.port, router=router)
Подскажите, какой способ реализации оптимальнее/лучше и почему. Быть может есть какие-то еще более интересные варианты?