当我使用python时,Django与socket io完美配合管理.pyrunserver但是如何处理gunicorn?

2024-06-13 07:35:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我得到了django example with socket.io的一些帮助

我发现一些问题,如果我运行这个代码,它将只运行我的套接字(5000),而不是我的主网站(8000) 所以我对它做了一点修改,主要的工作代码片段如下所示

socketio\u应用程序/视图.py你知道吗

from django.shortcuts import render

# Create your views here.
import socketio
sio = socketio.Server(async_mode='eventlet', always_connect=True)

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

类似于在github repo中,它们重写了runserver命令,我对它做了一些更改,使其看起来像 我还调用了super来运行主网站,该网站在端口5000处与线程套接字io一起编码

socketio\u应用程序/管理/命令/运行服务器.py你知道吗

from django.core.management.commands.runserver import Command as RunCommand

from socketio_app.views import sio
import os


class Command(RunCommand):
    help = 'Run the Socket.IO server'

    def handle(self, *args, **options):
        if sio.async_mode == 'threading':
            super(Command, self).handle(*args, **options)
        elif sio.async_mode == 'eventlet':
            import eventlet
            import eventlet.wsgi
            from ProLogger.wsgi import application
            import threading
            def fun():
                print(os.system("sudo kill -9 `sudo lsof -t -i:5000`"))
                eventlet.wsgi.server(eventlet.listen(('0.0.0.0', 5000)), application)
            t = threading.Thread(target=fun)
            t.start()
            import time
            time.sleep(3.5)

            super(Command, self).handle(*args, **options)

你知道吗wsgi.py公司你知道吗

import os

from django.core.wsgi import get_wsgi_application
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "ProLogger.settings")
import socketio
from socketio_app.views import sio   
application = get_wsgi_application()
application = socketio.WSGIApp(sio, application)

第一个问题是 1在线程中运行是一种好的做法吗 下一个问题是,因为我使用gunicorn来运行代码,所以永远不会调用runserver命令,也不会执行socket io的eventlet代码。 我的gunicorn bash脚本是这样的

[program:gunicorn]
command=gunicorn --name ProLogger-gunicorn --workers 2 ProLogger.wsgi:application --bind 0.0.0.0:8000 --timeout 100 -k ev$
directory=/home/ubuntu/ProLoggerBackend/
stdout_logfile=/home/ubuntu/logs/gunicorn_output.log
stderr_logfile=/home/ubuntu/logs/gunicorn_error.log
autostart=true
autorestart=true
startretries=10

既然runserver没有被调用,所以我的socket io代码就不会运行了,那么我应该如何继续呢

编辑

当我在另一个端口(5000)上运行应用程序时,它工作了。 在我的nginx配置中,我有一个类似proxy\u pass 127.0.0.1:8000的行 这就是为什么它不能在端口8000上工作,但在端口5000上工作的代码是相同的,WSGI和套接字都在同一端口5000上,没有任何错误,如“address already in use”


Tags: django端口代码fromioimportwsgiapplication