带有django和python socket io的事件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了带有django和python socket io的事件相关的知识,希望对你有一定的参考价值。

[每当我尝试将客户端连接到该服务器时,它都会成功连接,并且当客户端使用某些数据触发事件“聊天”时,它会以以下方式返回响应:“已收到您的味精” +已发送数据“欢迎”

[每当客户端触发“聊天”事件服务器时,sio也会触发“聊天”事件,但万一服务器本身想向客户端触发事件“聊天”,它将不起作用我尝试了不同的事情,例如

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")

我应该如何进行进一步操作,以便服务器本身可以触发“聊天”事件?并不是像现在这样的确认(即,每当客户端触发“聊天”服务器时也会触发“聊天”)

所以,如何从Django视图中触发事件?

答案

https://github.com/miguelgrinberg/python-socketio/issues/155#issuecomment-353529308此评论帮助我检查了运行wsgi和套接字服务器的进程ID我所做的最大错误是试图从端口8000从套接字服务器发出,但是服务器实际上已连接到端口5000。因此,从进程端口5000运行发射可以解决此问题。

以上是关于带有django和python socket io的事件的主要内容,如果未能解决你的问题,请参考以下文章

带有 3rd 方数据库的 Django Channels 和 Web Socket

NodeJS、Express 和多事的 Socket.io

允许多个用户加入聊天室(使用 Django、Socket.io 和 node.js)

Django:使用 Redis PubSub、Node.js 和 Socket.io 的 JSON 通知

带有 Python 的 SOCKS 代理

带有express和socket.io的节点js-找不到socket.io.js