Форум программистов, компьютерный форум, киберфорум
Python: Flask
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
58 / 62 / 34
Регистрация: 14.03.2014
Сообщений: 933

Веб-сервис (flask)

31.01.2020, 09:00. Показов 3300. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день! Есть код который исполняется на ОС Linux. Как с помощью веб-сервиса исполнить команду на виндовой машине и вернуть результат? (Например, список файлов переданной директории). Какой нибудь минимальный пример или план действий.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
31.01.2020, 09:00
Ответы с готовыми решениями:

Проблема с запуском сервера для веб-приложения на Flask
Сервер покупал на https://vds.selectel.ru Команды которые я использовал: Скрипт для запуска сервера nano vvm.script ...

Подключить PostgreSQL к Flask API и передавать данные таблицы в flask
Нужна срочная и большая помощь, надеюсь только на вас. Есть Python+QT5 (PYQT5) приложение. В таблицу приложения (QTableWidget)...

Веб-сервис файлообменник
Доброго времени суток. Вот есть такая задачка: На главной странице форма загрузки файлов и поле ввода времени жизни файла. По сабмиту...

15
1303 / 843 / 409
Регистрация: 12.03.2018
Сообщений: 2,305
31.01.2020, 09:06
Организовать взаимодействие между двумя процессами на двух разных машинах можно, например, с помощью Pyro (Pyro4).

Добавлено через 3 минуты
А... Вам нужен flask. Ошибочка.
0
58 / 62 / 34
Регистрация: 14.03.2014
Сообщений: 933
31.01.2020, 09:10  [ТС]
ioprst, Можете показать какой нибудь небольшой пример (с flask)? Гугл немного не то показывает. Если с Pyro эта задача решается проще, то буду пробовать с ним.
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
31.01.2020, 09:20
Как вариант: цепляться по ssh к другой машине и выполнять нужные команды. Уверен, что есть ssh-сервер для винды.

http://www.fabfile.org/

Добавлено через 1 минуту
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import sys
from fabric.api import env, execute, run
 
def main():
    execute(ls, hosts=["knitschi@buildknechtdebian9"])
    execute(dir, hosts=["knitschi@buildknechtwin"])
 
def ls():
    run('ls ~/ -l')
 
def dir():
    output = run('dir', shell=False)
 
if __name__ == '__main__':
    sys.exit(main())
1
1303 / 843 / 409
Регистрация: 12.03.2018
Сообщений: 2,305
31.01.2020, 09:21
Senarist, Pyro и Flask это немного разные вещи. Flask реализует серверную часть WEB-приложения. Pyro позволяет выполнять код на удаленной машине. Я не совсем понимаю, что вам нужно.
Привожу пример как я передавал файлы с Windows на Linux машину (т.к. тупо копипаст запретили).

Сервер на linux (в основном из документации Pyro4)
Кликните здесь для просмотра всего текста
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
import Pyro4
import Pyro4.core
import Pyro4.socketutil
import serpent
 
datafiles = {}  # temporary files
datablobs = {}  # in-memory
 
@Pyro4.expose
class FileServer(object):
 
    def open_file(self, fname):
        self.file = open(os.path.join(PROJECT_DIR, fname), 'wb')
        print('File "{0}" open for writing. Receiving data ...'.format(self.file.name))
        # self.write_to_log('File "{0}" open for writing. Receiving data ...'.format(self.file.name))
 
    def close_file(self):
        self.file.close()
        print('File "{0}" closed for writing.'.format(self.file.name))
        # self.write_to_log('File "{0}" closed for writing.'.format(self.file.name))
 
    def recv_data(self, data):
        data = serpent.tobytes(data)
        print('{0} data bytes received.'.format(len(data)))
        self.file.write(data)
        # self.write_to_log('{0} data bytes received.'.format(len(data)))
 
# из примеров в документации
class FileServerDaemon(Pyro4.core.Daemon):
    def __init__(self, host=None, port=0):
        super(FileServerDaemon, self).__init__(host, port)
        host, _ = self.transportServer.sock.getsockname()
        self.blobsocket = Pyro4.socketutil.createSocket(bind=(host, 0), timeout=Pyro4.config.COMMTIMEOUT, nodelay=False)
        print("Blob socket available on:", self.blobsocket.getsockname())
 
    def close(self):
        self.blobsocket.close()
        super(FileServerDaemon, self).close()
 
    def requestLoop(self, loopCondition=lambda: True):
        while loopCondition:
            rs = [self.blobsocket]
            rs.extend(self.sockets)
            rs, _, _ = select.select(rs, [], [], 3)
            daemon_events = []
            for sock in rs:
                if sock in self.sockets:
                    daemon_events.append(sock)
                elif sock is self.blobsocket:
                    self.handle_blob_connect(sock)
            if daemon_events:
                self.events(daemon_events)
 
    def handle_blob_connect(self, sock):
        csock, caddr = sock.accept()
        thread = threading.Thread(target=self.blob_client, args=(csock,))
        thread.daemon = True
        thread.start()
 
    def blob_client(self, csock):
        file_id = Pyro4.socketutil.receiveData(csock, 36).decode()
        print("{0} requesting file id {1}".format(csock.getpeername(), file_id))
        is_file, data = self.find_blob_data(file_id)
        if is_file:
            if hasattr(os, "sendfile"):
                print("...from file using sendfile()")
                out_fn = csock.fileno()
                in_fn = data.fileno()
                sent = 1
                offset = 0
                while sent:
                    sent = os.sendfile(out_fn, in_fn, offset, 512000)
                    offset += sent
            else:
                print("...from file using plain old read(); your os doesn't have sendfile()")
                while True:
                    chunk = data.read(512000)
                    if not chunk:
                        break
                    csock.sendall(chunk)
        else:
            print("...from memory")
            csock.sendall(data)
        csock.close()
 
    def find_blob_data(self, file_id):
        if file_id in datablobs:
            return False, datablobs.pop(file_id)
        elif file_id in datafiles:
            return True, datafiles.pop(file_id)
        else:
            raise KeyError("no data for given id")
 
with FileServerDaemon(host=given_ip, port=9090) as daemon:
    uri = daemon.register(FileServer, "server")
    print("Filetransfer server URI:", uri)
    daemon.requestLoop()


Клиент на винде
Кликните здесь для просмотра всего текста
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import os
import Pyro4
import Pyro4.errors
 
 
class FileClient:
 
    def __init__(self, ip):
        uri = "PYRO:server@{0}:9090".format(ip)
        self.pyro = Pyro4.core.Proxy(uri)
        self.connect = False
        self.status_send_data = False
 
    def set_pyro(self, ip):
        """
        Обновить uri и, соответственно, Proxy, если пользователь изменил ip
        """
        uri = "PYRO:server@{0}:9090".format(ip)
        self.pyro = Pyro4.core.Proxy(uri)
 
    def check_connect(self):
        """
        Проверка соединения с сервером.
        """
        with self.pyro as p:
            try:
                p._pyroBind()
                self.connect = True
            except Pyro4.errors.CommunicationError:
                self.connect = False
 
    def send_data(self, files):
        """
        Отправить файлы из списка files.
        """
        with self.pyro as p:
            try:
                for file in files:
                    p.open_file(os.path.basename(file))
                    with open(file, 'rb') as f:
                        data = f.read(1024)
                        while data:
                            p.recv_data(data)
                            data = f.read(1024)
                    p.close_file()
                self.status_send_data = True
            except:
                self.status_send_data = False


Работа с клиентом
Кликните здесь для просмотра всего текста
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
fc = FileClient(ip)
 
wait = wx.BusyInfo("Идет проверка соединения. Пожалуйста, подождите...")
fc.check_connect()
del wait
 
if not fc.connect:
    # обработка   
    pass
else:
    wait = wx.BusyInfo("Идет отправка данных. Пожалуйста, подождите...")
    fc.send_data(files)
    del wait
    if fc.status_send_data:
        print('ok')
    else:
        print('ne ok')
1
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
31.01.2020, 09:23
Ничто не мешает сделать во flask вьюшку и внутри неё выполнять действия (подключаться к удалённой машине и выполнять там команды).

Добавлено через 44 секунды
ioprst, веб-шелл человек пишет
0
58 / 62 / 34
Регистрация: 14.03.2014
Сообщений: 933
31.01.2020, 09:39  [ТС]
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Ничто не мешает сделать во flask вьюшку и внутри неё выполнять действия (подключаться к удалённой машине и выполнять там команды).
Вот какие нибудь примеры этого я бы и хотел увидеть)
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
31.01.2020, 09:47
Выше уже есть. Ставите на виндовую машину ssh-сервер. На веб-сервере герерируете ключи, закидываете на машинку с виндой публичный ключ. Проверяете, что ssh-соединение устанавливается из консоли.

А потом ставите fabric и проверяете его работу.

Добавлено через 3 минуты
Или веб-сервер это и есть виндовая машина?
0
58 / 62 / 34
Регистрация: 14.03.2014
Сообщений: 933
31.01.2020, 10:36  [ТС]
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Или веб-сервер это и есть виндовая машина?
так точно
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
31.01.2020, 10:45
Тогда легко: https://docs.python.org/3/library/subprocess.html

Запускаете процесс и подключаетесь к его stdin/stdout

Добавлено через 2 минуты
Python
1
2
with Popen(['dir'], stdout=PIPE) as p:
    print(p.stdout.read())
0
58 / 62 / 34
Регистрация: 14.03.2014
Сообщений: 933
03.02.2020, 08:42  [ТС]
Рыжий Лис, я не точно описал задачу. Мне нужно на сервер отправить файл, на нем его конвертнуть (subprocess) и вернуть файл уже с другим расширением (либо вернуть его двоичное представление)
@app.route('/')
def form():
return """
PHP/HTML
1
2
3
4
5
6
7
8
9
10
<html>
            <body>
                <h1>Transform a file demo</h1>
 
                <form action="/transform" method="post" enctype="multipart/form-data">
                    <input type="file" name="data_file" />
                    <input type="submit" />
                </form>
            </body>
        </html>
"""
Данный код показывает форму для выбора файла, а мне его выбирать не нужно.У меня уже к нему есть путь. Т.е. в моей задаче пользователю в браузере выбирать и нажимать ничего не нужно. Надо чтобы он просто улетел на сервер для начала.
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
03.02.2020, 08:56
Вытаскиваете из post-запроса файл(ы), сохраняете на диск. Либо настроить движок (flask), чтобы он принудительно сохранял файлы на диск, а не держал в оперативке. Потом получить путь до файла и можно конвертировать его внешней утилитой. Да хоть через subprocess (если он умеет дожидаться пока дочерний процесс не завершится).

Получаем новый файл. Вычитываем его и отправляем в браузер:
Python
1
2
with open('new_file.pdf', 'rb') as f:
     pass
https://flask.palletsprojects.... streaming/

Добавлено через 1 минуту
Хотя правильнее сохранять файл куда-то в папку, доступную nginx и передавать тому ссылку в заголовке X-Accel-Redirect (у меня сайт работает так).

Добавлено через 2 минуты
Пример для джанго:
Python
1
2
3
4
5
6
7
8
    if not os.path.exists(real_file):
        raise Http404
    file_type = mimetypes.guess_type(real_file)
    response = HttpResponse()
    response['Content-Type'] = file_type[0] if file_type else 'application/octet-stream'
    response['Content-Disposition'] = 'attachment; filename=file.pdf'
    response['X-Accel-Redirect'] = url
    return response
0
58 / 62 / 34
Регистрация: 14.03.2014
Сообщений: 933
03.02.2020, 09:08  [ТС]
Рыжий Лис, я в веб еще зеленый, поэтому вопрос очень глупый. А как отправить файл на сервер? По умолчанию работает GET запрос. POST отрабатывать будет когда я в форме (в браузере) выберу файлы. Но мне выбирать их не нужно, у меня уже есть файл на HD который я хочу отправить. Остальное вроде понятно.
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
03.02.2020, 09:11
Файл лежит на компьютере (где браузер) или на сервере?

Если на клиенте, то только выбирать в форме файл и через POST-запрос.
0
58 / 62 / 34
Регистрация: 14.03.2014
Сообщений: 933
03.02.2020, 09:13  [ТС]
Рыжий Лис, на компьютере где браузер (т.е. на клиенте), поэтому форма выбора мне не нужна. Файл уже есть.
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
03.02.2020, 11:36
Ну если не хотите отправлять файл через браузер, отправляйте файл на сервер post-запросом из другой программы.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.02.2020, 11:36
Помогаю со студенческими работами здесь

Простой веб-сервис на базе Python, который получает запрос и возвращает ответ после выполнения кода по API
Я два месяца назад начала самостоятельно изучать Python (это мой первый опыт программирования) и написала код, который на базе переменных,...

Веб-сервис uCoz ищет веб-программиста (Ростов-на-Дону)
Команда веб-сервиса uCoz рада принять в свои ряды опытного веб-разработчика для постоянной работы в офисе компании в г. Ростов-на-Дону ...

Написать веб-сервис, который будет общаться по http c другим веб-сервисом
Здравствуйте уважаемые коллеги! Извините за заголовок, не знал как лучше назвать эту тему. Вопрос в следующем ...Нужно написать веб...

Веб-сервер или веб-сервис
Здравствуйте! Проблема в том, что я не могу разобраться как реализуется следующая вещь: Есть приложение-клиент на андроид и...

веб-сервис и бд
доброе время суток. задание - написать веб-сервис который умеет подключаться к бд - брать и записывать данные. вопрос - чем лучше...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru