Как сделать web морду для выполнения python скриптов?
Добрый день.
Пытаюсь реализовать проект, по выгрузке отчетности через web интерфейс.
Пользователь заходит на Веб страницу, выбирает нужный ему отчет, делает фильтрацию (по дате например) и запускает отчет, который по исполнению выдает excel файл.
На данный момент у меня есть python скрипт, который подключается к нашей Oracle DB (с помощью cx_Oracle), выполняет SQL запрос, делает форматирование и сохраняет Excel файл.
Развернут Ubuntu сервер с Apache и mod_wsgi, собираюсь так же использовать Django для Webа. Скрипты на сервере через консоль отрабатываются. WSGI настроен (Django пока не прикручивал).
Теперь необходимо прикрутить к "кнопке" на web странице исполнение данного скрипта на сервере + как то выдать получившийся файл пользователю на скачивание.
В этом месте столкнулся с проблемой, либо копаю не в ту сторону, либо что-то делаю не так. Пытаюсь использовать WSGI, но не могу найти нормального примера выполнения сложного запроса, или запуска файла скрипта (всюду примеры Hello World).
Уважаемые Хабровцы, помогите пожалуйста советом.
Возможно не на той технологии зациклился.
Делаете вьюху, которая отображает текущую страницу где есть эта кнопка, в ней (во вьюхе) есть входящий параметр request. Вот его и смотрите. В этом параметре то, что вы передали, или если ничего не передали просто тогда запускаете нужную функцию во вьюхе и всё.
Если отчет генерируется долго или не стабильно по времени, то имеет смысл его "заказывать" через веб интерфейс, а потом скачивать готовый файл. В этом случае вам нужно сделать отдельную модель ТаскОтчета. Внутри неё записываются параметры построения отчета и статус готовности. Отдельный воркер на бэкенде смотрит регулярно на запрошенные отчеты и запускает ваш скрипт, после отработки обновляет статус задачи.
GUI для всего этого можно сделать на основе джанговских джинериков и админки.
Если нет никакой проблемы сгенерить отчет на лету, то сделайте хендлер прямо в вашем джанго, пусть дёргает ваш скрипт, генерит на лету отчет и выдает его как файл для скачивания с соответствующим MIME-типом. Можно повесить на обработчик кеширующий декоратор, чтобы не генерить один и тот же отчет слишком часто.
Мне больше нравится второй вариант, конечно.
Полагаю вам много не неясно из изложенного. Задавайте конкретные вопросы. Здесь помогут.
Если у автора в проекте уже используется джанго, то плодить сущности сверх необходимого смысла нет.
Ещё момент. Вот часто слышу что для тех или иных целей использовать тот или иной инструмент избыточно. Важно сколько времени и ресурсов уйдёт на решение задачи, а машинные мощности нынче дешевы. Используйте то, чем решите задачу как можно быстрее и с меньшим инженерным долгом на выходе. Получить MVP и точку роста с ясными признаками целесообразности проекта гораздо важнее, чем сделать что-то эффективно по задействованным фреймворкам или мощностям. Главное, чтобы решение было простым и понятным, чтобы его дёшево было улучшать позже.
Перечитал и не нашел упоминания, что уже используется Django. Я с вашим толкованием эффективности полностью согласен, и когда говорил об эффективности, как раз имел в виду затраты на начальное обучение. Собственно поэтому и предлагаю Flask. Вот для примера 'Hello world' средствами Flask:
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello World!"
if __name__ == "__main__":
app.run()
Другое дело, если автор хочет и задачу решить и за счет работодателя изучить популярный фреймворк... Тогда у меня возражений нет. Я и сам так часто делаю.
Перечитал и не нашел упоминания, что уже используется Django
Да вы правы, у меня нет привязки к конкретному фреймворку.
Начитался про мощь Джанго (и его востребованность), по этому хотел использовать его, так сказать начать осваивать на боевой задаче.
Хотел использовать Джанго из-за авторизации, на будущее. На сколько я понимаю мою задачу можно решить напрямую силами Джанго и трогать WSGI не нужно? (или я чего-то недопонял).
Из вариантов, которые описал Сергей, мне больше подходит первый, т.к. все таки время далеко не стабильно.
Я так до конца и не понял, каким образом запускать сам скрипт из Джанго? С помощью subprocess? На счет воркера тоже не понял. Буду гуглить.
Заранее извиняюсь за глупые вопросы, это мой первый проект и работаю я над ним сам, спросить не у кого.
Воля ваша, но когда мне приспичило сделать простенький web-сервис, -- я выбрал Flask. Потратил пару вечеров на то чтобы его скрестить с SQL-базой и запустить прототип. Сам не тоже не разработчик и web-приложение делал первый раз в жизни.
Скрипт можешь дёрнуть импортом модуля. Заверни весь свой скрипт в функцию и закинь файл внутрь. В вьюху добавь импорт скрипта(модуля) и тебе станет доступна функция находящаяся в нем. Далее запуск функции к кнопке и все.
П.с.: но я лично то же использовал flask для такого.
Alexandr Skorik, вы хотели прокомментировать свой вопрос, а сделали это в виде ответа на него? Собираетесь теперь его отметить решением?=)
все таки время далеко не стабильно
Насколько нестабильно? Измеряется в минутах? |Что за объёмы данных вы там перелопачиваете? Или квадратичная сложность алгоритма? Может быть это просто отдельная проблема,которую стоит оптимизировать?
Первый вариант гораздо сложнее будет для вас, чем второй. Мне кажется вам надо постепенно осваивать технологии, а не браться сразу за всё подряд.
Почитайте какую-нибудь книжку про джанго. Вам должно помочь для понимания как что там внутри работает. Очевидно, что сходу лезть и разглядывать примеры приложений на гитхабе вам рановато. Alons:
В вьюху добавь импорт скрипта(модуля) и тебе станет доступна функция находящаяся в нем. Далее запуск функции к кнопке и все.
Это решение по второй схеме.
ИМХО, первая схема будет сложновата для автора вопроса на данном этапе. Alons, Flask прекрасен для простых проектов и даже сложных, но на базе микросервисов. Кроме того Flask даст пощупать веб-разработку гораздо детальнее, позволит лучше разобраться в ней. Он меньше скрывает за своей внутренней магией, в отличие от джанги. Однако автору вопроса, похоже, нужно ехать, а не шашечки и у него приличные амбиции. Мне кажется это довольно самонадеянно так зарываться с нуля, но если цели ставятся именно так, то с джанговскими джинериками и админкой в совокупности сделать желаемое будет проще. Не уверен, что автор справится.
Нужно идти шагами поменьше.