Недавно понадобилось отправить файлы и данные формы из одного сервиса в другой. Задача кажется тривиальной до тех пор пока с ней не столкнешься. Я использовал для отправки запросов библиотеку requests, что из этого получилось ниже в статье
И так, задача
Есть два сервиса, первый обрабатывает данные полученные из формы, в том числе и файлы, обрабатывает их, и отправляет в другой сервис для сохранения данных.
Файлы мы не хотим сохранять в первом сервисе, а передавать его stream дальше.
Начнем с простого
Для начала подготовим простейший сервис который будет принимать данные и что-то с ними делать.
Сервис принимает например название категории и изображение.
И сервис отправки данных, из формы:
В index.html добавим саму форму:
Довольно простой сервис, неправда ли. Первый стартует на http://127.0.0.1:5001/ второй на http://127.0.0.1:5002/
Ближе к делу, сделаем отправку формы с помощью библиотеке requests
Во втором сервисе в методе пост мы уже получили данные из формы в переменные category и image, допустим нам нужно проверить что категория присутствует в нашем whitelist и затем в запрос добавим secret который известен только нашему сервису.
Импорт собственных модулей в Python. Import modules. Атрибут модуля __name__ и __main__
Модифицируем обработчик запроса POST таким образом:
На что здесь следует обратить внимание, в объекте files под ключом image, мы передаем кортеж, где по очереди перечислены filename, stream и mimetype. Это необходимо для того чтобы файл передался с нужными параметрами и на принимающей стороне не было бы проблем с его распознаванием.
Если бы в image, мы записали стразу stream, в принимающий сервис бы пришел файл, но его мета данные мы смогли бы получить только после сохранения.
Как вывод
На поиск особенности описанной выше, мне пришлось потратить чуть больше двух часов и активизировать свои способности экстрасенса. В принципе я полагаю, что где-то в документации, информация о том как передавать stream, есть, но мы же нелюбим читать 🙂
Источник: dev-gang.ru
Python-сообщество
- Начало
- » Python для новичков
- » Передача данных между программами
#1 Май 15, 2016 23:26:09
Передача данных между программами
Есть скрипт, который обрабатывает данные. Есть второй, который использует данные. Как передавать эти данные между ними, чтобы родительская программа не останавливалась? С помощью pipe это возможно сделать?
Если не сложно, подбросите примеры или литературу по этой теме.
#2 Май 16, 2016 06:04:30
Передача данных между программами
pipe Да возможно. Есть subprocess.Popen, shared memory, socket, файлы ОС, коннекты к базам данных и еще куча способов. Но самый простой способ это объединить скрипты в одну программу. Другие способы надо рассматривать если вы можете объяснить почему нельзя проводить обработку в одной программе.
Работа с файлами в Python. Чтение и запись данных
По поводу не останавливалась. А что вашей программе еще надо делать? От этого собственно и ответ зависит. Если это GUI то у него свои очереди сообщений…
Отредактировано doza_and (Май 16, 2016 06:07:19)
#3 Май 16, 2016 09:22:41
Передача данных между программами
doza_and
pipe Да возможно. Есть subprocess.Popen, shared memory, socket, файлы ОС, коннекты к базам данных и еще куча способов. Но самый простой способ это объединить скрипты в одну программу. Другие способы надо рассматривать если вы можете объяснить почему нельзя проводить обработку в одной программе.По поводу не останавливалась. А что вашей программе еще надо делать?
От этого собственно и ответ зависит. Если это GUI то у него свои очереди сообщений…
Основная программа довольно большая (2200 строк), она нужна для управления 3D-принтером. Она имеет GUI. Мне нужно установить ее на Raspberry, к которому подцепить маленький дисплей и кнопки, чтобы он читал с флешки файлы, выводил на дисплей и этот список листался кнопками. Для этого написал вспомогательную программу, которая по завершении возвращает имя выбранного файла.
Основная программа его получает и работает с этим файлом. Теперь нужно, чтобы дисплей выводил не только с список файлов, но и процент загрузки файла. Сейчас процент выводится в GUI, нужно чтобы это дублировалось на дисплее, за который отвечает моя программа.
#4 Май 16, 2016 10:03:34
Передача данных между программами
Почти наверняка надо делать не отдельную программу а добавлять функциональность в основную. Одна из основных концепций питона — возможность у модулей реализовать возможность автономной работы и встраивание во внешнюю программу см if __name__ == “__main__”. Вам оно подойдет. Осталось неясно используется одна GUI библиотека или разные. Программы выполняются на 2 устройствах или на одном.
Неясен тезис по поводу 2200 строк. Разбивайте программу на обозримые модули.
Отредактировано doza_and (Май 16, 2016 10:04:10)
Источник: python.su
Как в Python передавать данные из одного скрипта в другой?
Есть скрипт №1, выполняющий роль API на сервере. Работает постоянно. При определенных запросах скрипт №1 должен запускать скрипт №2 и передавать ему определенные данные, которые скрипт №2 обработает и сделает определенные действия. Если коротко, скрипт №1 запускает скрипт №2 и говорит ему «На тебе вот эти данные, делай с ними что хочешь»=)). Как это реализовать?
- Вопрос задан более двух лет назад
- 1608 просмотров
1 комментарий
Простой 1 комментарий
а просто передать через файл не получается ? ну может не файл а пайп или сокет ?
или можно просто открыть дочерний процесс и напрямую писать в его входной поток.
Решения вопроса 1
Скрипт №1 добавляет задачу, скрипт №2 получает ее и выполняет необходимые действия
Ответ написан более двух лет назад
Комментировать
Нравится Комментировать
Ответы на вопрос 3
Когда устанешь разбирать с селерами, рэббитами, и прочей ненужной дичью, просто открой доку питона и прочитай про мультипроцессинг
https://docs.python.org/3/library/multiprocessing.html
Ответ написан более двух лет назад
Комментировать
Нравится 2 Комментировать
а в описании Celery мы видим такие штуки — RabbitMQ и Redis, вот если не нужна функциональность Celery, то можно этими ребятами пользоваться (Есть еще некоторое количество брокеров сообщений, можно погуглить) И если Redis — это всетаки БД, просто с опцией публикации и чтения данных (как каналы в телеграм, можно опубликовать что то, а подписанные на получение скрипты это получат), то Rabbit предназначен ровно для обмена данными между двумя приложениями, в том числе и скриптами Python
Ответ написан более двух лет назад
Комментировать
Нравится Комментировать
В общем, используется IPC.
Часто для таких вещей используются очереди. Например, ZeroMQ или что-то другое, например, популярный RabbitMQ.
Ответ написан более двух лет назад
Комментировать
Нравится Комментировать
Ваш ответ на вопрос
Войдите, чтобы написать ответ
- Python
- +1 ещё
Как задать отношения в sqlalchemy что бы свойство было доступной в обеих моделях?
- 1 подписчик
- вчера
- 33 просмотра
Источник: qna.habr.com