带有 django 和 python 套接字 io 的 eventlet
eventlet with django and python socket io
每当我尝试将客户端连接到服务器时,它都会成功连接,并且当客户端使用一些数据触发事件 'chat' 时,它会收到如下响应:
"received your msg" + 数据已发送
"welcome"
每当客户端触发 'chat' 事件时,服务器(sio)也会触发 'chat' 事件,但如果服务器本身想要向客户端触发事件 'chat' 它就不起作用
我尝试了不同的东西,比如
import eventlet
eventlet.monkey_patch()
然后我尝试了
sio.start_background_task()
在那之后我也尝试了普通线程,但那也不起作用。
除此之外我也试过
eventlet.spawn()
但仍然没有改善。
我该如何进行?
socketio_app/views.py
import threading
import time
import eventlet
eventlet.monkey_patch()
from django.shortcuts import render
# Create your views here.
import socketio
sio = socketio.Server(async_mode='eventlet')
@sio.event
def connect(sid, environ):
print('connected to ', sid)
return True
@sio.event
def disconnect(sid):
print("disconnected", sid)
@sio.on('chat')
def on_message(sid, data):
print('I received a message!', data)
sio.emit("chat", "received your msg" + str(data))
sio.emit("chat", "welcome")
@sio.event
def bg_emit():
print("emiitting")
# sio.emit('chat', dict(foo='bar'))
sio.emit('chat', data='ment')
def bkthred():
print("strting bckgroud tsk")
while True:
eventlet.sleep(5)
bg_emit()
def emit_data(data):
print("emitting strts")
# sio.start_background_task(target=bkthred)
eventlet.spawn(bkthred)
supervisord.conf
[program:gunicorn]
command=gunicorn --name ProLogger-gunicorn --workers 2 ProLogger.wsgi:application --bind 0.0.0.0:8000 --timeout 100 -k eventlet
#directory=/home/ubuntu/ProLoggerBackend/
directory=/home/nimish/PycharmProjects/ProLoggerBackend/ProLogger/
stdout_logfile=/home/ubuntu/logs/gunicorn_output.log
stderr_logfile=/home/ubuntu/logs/gunicorn_error.log
autostart=true
autorestart=true
startretries=10
environment=PYTHONUNBUFFERED=1
[program:gunicornsocketio]
command=gunicorn --name ProLoggerSocket-gunicorn --workers 1 ProLogger.wsgi:socket_application --bind 0.0.0.0:5000 -k eventlet
#directory=/home/ubuntu/ProLoggerBackend/
directory=/home/nimish/PycharmProjects/ProLoggerBackend/ProLogger/
stdout_logfile=/home/ubuntu/logs/gunicornsocket_output.log
stderr_logfile=/home/ubuntu/logs/gunicornsocket_error.log
autostart=true
autorestart=true
startretries=10
environment=PYTHONUNBUFFERED=1
8000端口运行主应用
端口 5000 运行套接字
wsgi.py
from django.core.wsgi import get_wsgi_application
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "ProLogger.settings")
from utility.environment_utils import set_settings_module
import socketio
from socketio_app.views import sio
application = get_wsgi_application()
socket_application = socketio.WSGIApp(sio, application)
我的简单测试客户端应用程序
import socketio
sio = socketio.Client()
@sio.event
def connect():
print('connection established')
@sio.on("chat")
def my_message(data):
print('message received with ', data)
@sio.event
def disconnect():
print('disconnected farom server')
sio.connect('http://0.0.0.0:5000')
# sio.connect('http://3.17.182.118:5000')
# sio.wait()
# socketio.WSGIApp()
# socketio.Server()
sio.emit("chat", "hello")
我应该如何进一步处理以便服务器本身可以触发 'chat' 事件?
不像现在这样作为确认(即每当客户端触发 'chat' 服务器也会触发 'chat')
那么,如何从 Django 视图触发事件?
https://github.com/miguelgrinberg/python-socketio/issues/155#issuecomment-353529308
这个评论帮助我检查了 运行 wsgi 和套接字服务器的进程 ID
我犯的最大错误是试图从端口 8000 的套接字服务器发出,但服务器实际上连接到端口 5000。
所以 运行 从进程端口 5000 发出解决了这个问题。
每当我尝试将客户端连接到服务器时,它都会成功连接,并且当客户端使用一些数据触发事件 'chat' 时,它会收到如下响应: "received your msg" + 数据已发送 "welcome"
每当客户端触发 'chat' 事件时,服务器(sio)也会触发 'chat' 事件,但如果服务器本身想要向客户端触发事件 'chat' 它就不起作用 我尝试了不同的东西,比如
import eventlet
eventlet.monkey_patch()
然后我尝试了
sio.start_background_task()
在那之后我也尝试了普通线程,但那也不起作用。
除此之外我也试过
eventlet.spawn()
但仍然没有改善。 我该如何进行?
socketio_app/views.py
import threading
import time
import eventlet
eventlet.monkey_patch()
from django.shortcuts import render
# Create your views here.
import socketio
sio = socketio.Server(async_mode='eventlet')
@sio.event
def connect(sid, environ):
print('connected to ', sid)
return True
@sio.event
def disconnect(sid):
print("disconnected", sid)
@sio.on('chat')
def on_message(sid, data):
print('I received a message!', data)
sio.emit("chat", "received your msg" + str(data))
sio.emit("chat", "welcome")
@sio.event
def bg_emit():
print("emiitting")
# sio.emit('chat', dict(foo='bar'))
sio.emit('chat', data='ment')
def bkthred():
print("strting bckgroud tsk")
while True:
eventlet.sleep(5)
bg_emit()
def emit_data(data):
print("emitting strts")
# sio.start_background_task(target=bkthred)
eventlet.spawn(bkthred)
supervisord.conf
[program:gunicorn]
command=gunicorn --name ProLogger-gunicorn --workers 2 ProLogger.wsgi:application --bind 0.0.0.0:8000 --timeout 100 -k eventlet
#directory=/home/ubuntu/ProLoggerBackend/
directory=/home/nimish/PycharmProjects/ProLoggerBackend/ProLogger/
stdout_logfile=/home/ubuntu/logs/gunicorn_output.log
stderr_logfile=/home/ubuntu/logs/gunicorn_error.log
autostart=true
autorestart=true
startretries=10
environment=PYTHONUNBUFFERED=1
[program:gunicornsocketio]
command=gunicorn --name ProLoggerSocket-gunicorn --workers 1 ProLogger.wsgi:socket_application --bind 0.0.0.0:5000 -k eventlet
#directory=/home/ubuntu/ProLoggerBackend/
directory=/home/nimish/PycharmProjects/ProLoggerBackend/ProLogger/
stdout_logfile=/home/ubuntu/logs/gunicornsocket_output.log
stderr_logfile=/home/ubuntu/logs/gunicornsocket_error.log
autostart=true
autorestart=true
startretries=10
environment=PYTHONUNBUFFERED=1
8000端口运行主应用 端口 5000 运行套接字
wsgi.py
from django.core.wsgi import get_wsgi_application
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "ProLogger.settings")
from utility.environment_utils import set_settings_module
import socketio
from socketio_app.views import sio
application = get_wsgi_application()
socket_application = socketio.WSGIApp(sio, application)
我的简单测试客户端应用程序
import socketio
sio = socketio.Client()
@sio.event
def connect():
print('connection established')
@sio.on("chat")
def my_message(data):
print('message received with ', data)
@sio.event
def disconnect():
print('disconnected farom server')
sio.connect('http://0.0.0.0:5000')
# sio.connect('http://3.17.182.118:5000')
# sio.wait()
# socketio.WSGIApp()
# socketio.Server()
sio.emit("chat", "hello")
我应该如何进一步处理以便服务器本身可以触发 'chat' 事件? 不像现在这样作为确认(即每当客户端触发 'chat' 服务器也会触发 'chat')
那么,如何从 Django 视图触发事件?
https://github.com/miguelgrinberg/python-socketio/issues/155#issuecomment-353529308 这个评论帮助我检查了 运行 wsgi 和套接字服务器的进程 ID 我犯的最大错误是试图从端口 8000 的套接字服务器发出,但服务器实际上连接到端口 5000。 所以 运行 从进程端口 5000 发出解决了这个问题。