簡體   English   中英

帶有 django 和 python 套接字 io 的 eventlet

[英]eventlet with django and 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 運行發射解決了這個問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM