Как организовать взаимодействие между клиентом и сервером на питоне?

Здравствуйте.
Есть небольшой скрипт по студенческой работе, в целях самообразования хочется его разделить на клиентскую часть и серверную.
Подскажите, как организовать взаимодействие между этими двумя частями?
У меня в голове только вариант с микро веб сервером на фласк который будет АПИ предоставлять.
Может быть есть более разумные варианты?
upd
В идеале хотелось бы чтобы клиент мог отдать что-то серверу и работать дальше. А сервер когда готов ответ отдаёт клиенту то что он у него попросил.
Спасибо!
  • Вопрос задан
  • 491 просмотр
Решения вопроса 2
nextel
@nextel
ненавижу javascript
Это смаый нормалльый вариант, еще прицепить сервер к торнадо и закрыть это все ngnix' ом а на морду бустрап и какой угодно js фрейморк, хотя для студенческой работы хватит и стандартного шаблонизатора
Ответ написан
leahch
@leahch
3D специалист. Dолго, Dорого, Dерьмово.
Самый нормальный вариант - twisted! Можно взять самый простой пример echoclient/echoserver twistedmatrix.com/documents/current/core/examples
Ну и вариант по-сложнее - https://habrahabr.ru/post/97201/

Также немного нужно вывернуть мозг с асинхронным программироавнием и deferred.

Собственно у меня это получилось за два-три дня. Сейчас куча вещей на нем написана, могу подсказать :-)

Да хоть сервер (web) на нем поднять, к которому будут клиенты коннектиться и давать ему задания - дело 10 строк.

Да, на твистед есть и аналог торнадо - cyclone.io
Это практически полный аналог торнадо (и по производительности), но со всеми плюшками твистед. Я его тоже активно пользую, для веб-морд своих приложений.

А вот и пример на скорую руку:
import cyclone.web
import sys

from twisted.internet import reactor, threads
from twisted.python import log

def doLongCalculation():
    # .... do long calculation here ...
    return 3

result = 0

def doResult(x):
    global result
    result =  x

class StartHandler(cyclone.web.RequestHandler):
    def get(self):
        # run method in thread and get result as defer.Deferred
        d = threads.deferToThread(doLongCalculation)
        d.addCallback(doResult)
        self.write("Start!")

class StatusHandler(cyclone.web.RequestHandler):
    def get(self):
        global result
        self.write("Result = %s" % (result))

if __name__ == "__main__":
    application = cyclone.web.Application([
        (r"/", StatusHandler),
        (r"/start", StartHandler)
    ])

    log.startLogging(sys.stdout)
    reactor.listenTCP(8888, application, interface="127.0.0.1")
    reactor.run()

В глобальной переменной result, будет лежать значение после старта по обращению (я браузером пользовался) localhost:8888/start , которое отработается в треде методом doLongCalculation, а результат будет обработан методом doResult. Ответ смотрим браузером по localhost:8888

В общем, вариантов масса.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы