Подтвердить что ты не робот

Нужна помощь в понимании кометы в Python (с Django)

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

Я совершенно новичок в этом, все, что я делал раньше, было простым сайтом, отличным от реального времени, с бэкэндом PHP/Django на Apache.

Моя цель - создать чат-приложение в режиме реального времени; надеюсь, привязаны к Django для пользователей, auth, templates и т.д.

Каждый раз, когда я читаю об инструменте, он говорит, что мне нужен еще один инструмент поверх него, он чувствует себя как бесконечная цепочка.

Во-первых, может ли кто-нибудь классифицировать все инструменты, необходимые для этой работы?
Я читал о разных серверах, сетевых библиотеках, механизмах, JavaScripts для клиентской стороны, и я не знаю, что еще. Я никогда не думал, что это будет такой сложный процесс.

Twisted/Twisted Web кажется популярным, но я не собираюсь его интегрировать или что еще мне нужно (угадывание я требуется, по крайней мере, клиентская JS).

Если я правильно понимаю, Orbited построен на Twisted, мне нужно что-нибудь еще с ним?

Являются ли Gevent и Eventlet в той же категории, что и Twisted? Что еще мне нужно с ними?

Где такие вещи, как сельдерей, RabbitMQ или KV, такие как Redis? Я не понимаю концепцию очереди сообщений. Являются ли они важными и какие услуги они предоставляют?

Есть ли какие-либо полные учебные приложения для чата, на которые я должен смотреть?

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

4b9b3361

Ответ 2

Я чувствую твою боль, ей пришлось пройти те же исследования за последние несколько месяцев. Я еще не успел обработать надлежащую документацию, но у меня есть рабочий пример использования Django с socket.io и tornadio в http://bitbucket.org/virtualcommons/vcweb - Я надеялся настроить прямое сообщение от сервер Django на серверный процесс tornadio с использованием очередей (т.е. логика в представлении django выводит сообщение в очередь, которое затем обрабатывается торнадо, которое подталкивает кодированную версию этого сообщения всем заинтересованным подписчикам) t полностью реализовала эту часть. Способ, которым я сейчас его создал, включает в себя:

  • внешний сервер торнадо (торнадо), работающий на другом порту, прием запросов socket.io и работа с моделями Django. Единственное, что записывает этот серверный процесс в базу данных, - это сообщения чата, которые необходимо сохранить. Он имеет полный доступ ко всем моделям Django и т.д., И все взаимодействия в реальном времени должны проходить прямо через этот серверный процесс.
  • Страницы шаблонов Django, требующие доступа в режиме реального времени, включают javascript socket.io и устанавливают прямые подключения к серверу tornadio.

Я просмотрел orbited, hookbox, gevent, но решил пойти с socket.io + торнадо, поскольку он, по-видимому, позволил мне получить самый чистый код javascript + python. Я мог ошибаться, хотя, только что начал изучать Python/Django за последний год.

Ответ 3

Redis релевантен как уровень персистентности, который также поддерживает родную публикацию/подписку. Поэтому вместо ситуации, когда вы проводите опрос db, ища новые сообщения, вы можете подписаться на канал и получить от вас сообщения.

Я нашел рабочий пример типа описываемой системы. Магия происходит в представлении socketio:

def socketio(request):
    """The socket.io view."""
    io = request.environ['socketio']
    redis_sub = redis_client().pubsub()
    user = username(request.user)

    # Subscribe to incoming pubsub messages from redis.
    def subscriber(io):
        redis_sub.subscribe(room_channel())
        redis_client().publish(room_channel(), user + ' connected.')
        while io.connected():
            for message in redis_sub.listen():
                if message['type'] == 'message':
                    io.send(message['data'])
    greenlet = Greenlet.spawn(subscriber, io)

    # Listen to incoming messages from client.
    while io.connected():
        message = io.recv()
        if message:
            redis_client().publish(room_channel(), user + ': ' + message[0])

    # Disconnected. Publish disconnect message and kill subscriber greenlet.
    redis_client().publish(room_channel(), user + ' disconnected')
    greenlet.throw(Greenlet.GreenletExit)

    return HttpResponse()

Пошаговое представление:

  • Настроить socket.io, получить клиент redis и текущего пользователя
  • Используйте Gevent для регистрации "подписчика" - это принимает входящие сообщения от Redis и пересылает их в клиентский браузер.
  • Запустите "издатель", который принимает сообщения из socket.io(из пользовательского браузера) и выталкивает их в Redis
  • Повторяйте до разъединения разъема

Redis Cookbook дает немного больше деталей на стороне Redis, а также обсуждает, как вы можете сохранять сообщения.

Относительно остальной части вашего вопроса: Twisted - это сетевая библиотека, основанная на событиях, ее можно рассматривать как альтернативу Gevent в этом приложении. Это мощно и сложно отлаживать мой опыт.

Сельдерей - это "распределенная очередь задач" - в основном, он позволяет вам распределять единицы работы на нескольких машинах. "Распределенный" угол означает, что между машинами требуется какой-то транспорт. Сельдерей поддерживает несколько видов транспорта, включая RabbitMQ (и Redis тоже).

В контексте вашего примера, сельдерей был бы уместным, если бы вам приходилось выполнять какую-то дорогостоящую обработку на каждое сообщение, например, сканирование на ненормативную лексику или что-то в этом роде. Тем не менее, что-то должно было бы инициировать задачу Сельдери, поэтому должен быть некоторый код, прослушивающий обратный вызов socket.io.

(На всякий случай, когда вы не были полностью смущены, сам сельдерей может быть использован для использования Gevent в качестве базовой библиотеки concurrency.)

Надеюсь, что это поможет!