2016-10-23 3 views
3

У меня проблема с каналами django. Приложение Django отлично работает с WSGI для HTTP-запросов. Я попытался выполнить миграцию на каналы, чтобы разрешить запросы на веб-рассылку, и выясняется, что после установки каналов и запуска ASGI (дафни) и рабочего сервера сервер отвечает на ошибку 503, а браузер отображает ошибку 504 (тайм-аут) для http запросы, которые ранее работали (например, страница администратора). Я прочитал все учебники, которые мог найти, и я не понимаю, в чем проблема. Более того, если я запускаю «runerver», он работает нормально.Django каналы с дафной и работником

У меня есть Nginx перед приложением (на отдельном сервере), работая как прокси-сервер и loadbalancer. Я использую Django 1.9.5 с asgi-redis> = 0.10.0, channels> = 0.17.0 и daphne> = 0.15.0. Файлы wsgi.py и asgi.py находятся в одной папке. Редис работает.

Команда, которую я ранее используя с WSGI (и который до сих пор работает, если вернуться к нему) является: uwsgi --http :8000 --master --enable-threads --module Cats.wsgi

Команда, которая работает с использованием runserver является: python manage.py runserver 0.0.0.0:8000

Команды, которые не для запросов, которые работают с 2 другими командами являются: daphne -b 0.0.0.0 -p 8000 Cats.asgi:channel_layer python manage.py runworker

Дополнительная информация: Я добавил «каналы» в установленных приложений (в settings.py)

другой settings.py отношение информация

CHANNEL_LAYERS = { 
"default": { 
    "BACKEND": "asgi_redis.RedisChannelLayer", 
    "ROUTING": "Cats.routing.app_routing", 
    "CONFIG": { 
     "hosts": [(os.environ['REDIS_HOST'], 6379)], 
    }, 
}, 

}

Кошки/routing.py

from channels.routing import route, include 
from main.routing import routing as main_routing 

app_routing = [ 
    include(main_routing, path=r"^/ws/main"), 
] 

главная/routing.py

from channels.routing import route, include 

http_routing = [ 
] 

stream_routing = [ 
    route('websocket.receive', 'main.consumers.ws_echo'), #just for test once it will work 
] 

routing = [ 
    include(stream_routing), 
    include(http_routing), 
] 

основные/потребители. py

def ws_echo(message): 
message.reply_channel.send({ 
    'text': message.content['text'], 
}) 

#this consumer is just for test once it will work 

Любая идея, что может быть неправильным? Вся помощь очень ценится! Ty

EDIT: Я попробовал новую вещь:

python manage.py runserver 0.0.0.0:8000 --noworker 
python manage.py runworker 

И это не работает, в то время как python manage.py runserver 0.0.0.0:8000 работал ...

Любая идея, что может помочь?

+0

Отредактировано мое сообщение с новой попыткой отделить работника от «сервера-запуска». Он тоже не работает – Yom86

+0

Вы проверили redis, если daphne действительно отправляет запрос в очередь? – r00m

+0

Разве вы решили это тем временем? У нас есть каналы, работающие на производстве, но когда я пытаюсь развернуть тот же проект на нашем dev-сервере, я получаю эту проблему. Рабочий получает запрос, но он останавливается. daphne (runningerver) возвращает 503, а в браузере я получаю 504. – ThaJay

ответ

0

каналы будут использовать представления по умолчанию для нераспределенных запросов. если вы использовать JavaScripts права, я предлагаю вам использовать только ваш Cats по умолчанию/routing.py файл следующим образом:

from channels.routing import route 
from main.consumers import * 


app_routing = [ 
    route('websocket.connect', ws_echo, path="/ws/main") 
] 

или наоборот, чтобы помочь с путем

from django.urls import reverse 

from channels.routing import route 
from main.consumers import * 


app_routing = [ 
    route('websocket.connect', ws_echo, path=reverse('main view name')) 
] 

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

def ws_echo(message): 
    Group("notifications").add(message.reply_channel) 
    Group("notifications").send({ 
     "text": json.dumps({'testkey':'testvalue'}) 
    }) 

функция отправки, вероятно, должна быть вызвана на другом событии и «уведомления» Группу, вероятно, следует изменить на есть канал, посвященный пользователю. что-то вроде

from channels.auth import channel_session_user_from_http 

@channel_session_user_from_http 
def ws_echo(message): 
    Group("notify-private-%s" % message.user.id).add(message.reply_channel) 
    Group("notify-private-%s" % message.user.id).send({ 
     "text": json.dumps({'testkey':'testvalue'}) 
    }) 
+0

посвященный пользователю, намного проще: 'message.reply_channel.send ({'text': json.dumps ({'test': 'tetest'})})' , если вы не ожидаете, что у пользователя будет несколько соединений, сообщение. – ThaJay

0

Если вы используете Heroku или Докку убедитесь, что вы правильно установить «масштаб», чтобы включить рабочий процесс. По умолчанию они будут запускать только веб-экземпляр, а не рабочий.

Для Heroku

heroku ps:scale web=1:free worker=1:free 

Доку создать файл с именем DOKKU_SCALE и добавить в:

web=1 
worker=1 

См: