Значения переменных MEDIA_ROOT
и STATIC_ROOT
в вашем settings.py
имеют запятую. Конечная запятая превращает значение этих переменных из строки в кортеж.
MEDIA_ROOT = os.path.join(BASE_DIR, 'media'), # This is a tuple
STATIC_ROOT = os.path.join(BASE_DIR, 'static'), # So is this
Удаление задней запятой должно решить проблему.
MEDIA_ROOT = os.path.join(BASE_DIR, 'media') # This is now a string
STATIC_ROOT = os.path.join(BASE_DIR, 'static') # So is this
Если Вы собираетесь быть выполнением Flash dev, Вы посмотрели на SmartfoxServer? Это имеет все, что Вы хотите, и имеет собственные клиентские библиотеки Flash. Я использовал в на проекте управлять 10-ми тысяч подключенных пользователей.
Yurii,
RabbitMQ, Haxe и as3: http://geekrelief.wordpress.com/2008/12/15/hxamqp-amqp-with-haxe/
RabbitMQ, Ruby и ACLs: http://pastie.org/pastes/368315
Вы могли бы также хотеть посмотреть на использование Nanite с RabbitMQ для управления группами бэкенда: http://brainspl.at/articles/2008/10/11/merbcamp-keynote-and-introducing-nanite
Вы говорите, что Вам нужно:
* broadcast messages by any client (1:N, N:N)
* (potentially) direct messages (1:1)
Можно легко сделать оба использования RabbitMQ. RabbitMQ поддерживает оба случая, 1:N pubsub и 1:1 обмен сообщениями, с 'прямыми' обменами.
Прямой обменный шаблон следующие:
Любой издатель (элемент группы) отправляет сообщение брокеру с 'клавишей маршрутизации', такой как "yurii". RabbitMQ соответствует этому ключу привязке подписки в таблице маршрутизации (иначе "обмен") для Вас. Каждая привязка представляет подписку очередью, выражая интерес к сообщениям с данной клавишей маршрутизации. Когда маршрутизация и обязательное соответствие ключей, сообщение затем направляется очередям для последующего потребления клиентами (элементы группы). Это работает на 1:N и 1:1 случаи; с N:N, основывающимся 1:N.
Введение в модель маршрутизации: http://blogs.digitar.com/jjww/2009/01/rabbits-and-warrens/
Общее введение: http://google-ukdev.blogspot.com/2008/09/rabbitmq-tech-talk-at-google-london.html
Вы также требуете:
* (important) authenticate/authorize clients with my own backend (say, through some kind of HTTP API)
См. код ACLs для этого (ссылка выше). Существует также интерфейс HTTP к RabbitMQ, но мы еще не объединили фронтэнд HTTP с кодом ACL. Это не должно сдерживать Вас все же. Придите к rabbitmq-обсуждать списку, где об этой теме говорили недавно.
Вы также требуете:
* create groups (by some backend process)
* to be able to kick specific clients by backend process (or server plugin)
Я предлагаю смотреть на то, как инструменты как Nanite и Workling делают это. Создание группы обычно не является частью системы обмена сообщениями, вместо этого, в RabbitMQ, Вы создаете шаблоны маршрутизации с помощью подписок. Можно ударить определенные клиенты путем отправки сообщений им тем, какой бы ни ключ они раньше связывали их использующую очередь с обменом.
Надеюсь, это поможет!
alexis
Хорошо коммуникация группы является немного отличающимся зверем, чем простой обмен сообщениями / организация очередей.
Большинство систем связи группы является коммерческим, но существует два (что я знаю о), открытый исходный код / свободный, можно смотреть на:
Оба из них могли бы быть жесткими для нахождения привязки Ruby все же. Распространение и вероятно OpenAIS, просматривают клиенты, как доверяется, таким образом, клиент на базе браузера не имеет смысла. У Вас должны были бы быть свои фронтенды браузера, говорят с клиентом (клиентами) группы на бэкенде.
Мы использовали ActiveMQ. Наш поставщик, который предоставляет нашу систему HR, использует Ruby/ActiveMQ, чтобы широковещательно передать и получить обновления.
Другими брокерами сообщений с открытым исходным кодом, поддерживающими протокол Stomp, являются OpenMQ, который включен в GlassFish V3 и GlassFish 2.1.1, но также работает автономно, и вскоре брокер сообщений JBoss, HornetQ V2.1 . OpenMQ поддерживает временные очереди, которые полезны для связи в стиле RPC, но ActiveMQ также предлагает некоторые интересные функции в адаптере Stomp.