Python+Django+channels 웹소켓 구현

10072 단어
현재 인터넷상에서 대부분은django를 바탕으로 웹소켓을 실현하는 것이 모두 오래된 버전이다. 그러나django와channels는 2.0+버전으로 업그레이드되어 구축 과정에서 수많은 구덩이를 메웠다. 다행히 많은 홈페이지의 글을 보고 드디어 해결했다. 모두 영문이다. 시간이 좀 지났고 밑에 원본 코드를 붙여서 모두가 함께 교류하는 것을 환영한다.
프로젝트 버전:
Python 3.6
Django 2.0.2
Channels 2.0.2
channels_redis 2.0.2
Daphne 2.0.4
asgi_redis 1.4.3
asgiref   2.1.6
pypiwin32 2.2.3

참고 사항:
1, channels를 설치하기 전에 나머지 라이브러리를 모두 설치하고 PIP를 사용하면 됩니다. 설치 과정에 유니코드 Decode Error:'utf-8'codec can not decode byte 0xd6 in position 2: invalid continuation byte 오류가 발생하면 D:\Python36-32\Lib\site-packages\pip\compat\init_.py에서returns.decode('utf-8')는returns.decode('gbk')로 수정되었습니다.
2. 프로젝트는 Redis를 기반으로 합니다. 여러분이 직접 Redis를 설치하고 실행하고 channels를 실행할 때 Redis가 Redis 시작 명령을 시작하고 cmd가 Redis 설치 디렉터리(c:\\\redis), Redis-server에 들어갈 것을 보증합니다.exe redis.windows.conf 리턴, 정상적으로 no error가 표시됩니다.기본적으로redis는 서비스로 되어 있으며, 전원을 켜고 자동으로 시작하기 때문에 한 번만 시작하면 됩니다.
구성 프로세스:
settings.py 파일
redis_host = os.environ.get('REDIS_HOST', 'localhost')

# Channel layer definitions
# http://channels.readthedocs.io/en/latest/topics/channel_layers.html
CHANNEL_LAYERS = {
    "default": {
        # This example app uses the Redis channel layer implementation channels_redis
        "BACKEND": "channels_redis.core.RedisChannelLayer",
        "CONFIG": {
            "hosts": [(redis_host, 6379)],
        },
    },
}

ASGI_APPLICATION = "NetWorkMonitor.routing.application"
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'channels',
    'AppMain',
    'WebSocket',
]

asgi를 추가합니다.py 파일의 내용은 다음과 같습니다.
import os
import django
from channels.routing import get_default_application

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "NetWorkMonitor.settings")
django.setup()
application = get_default_application()

wsgi를 수정합니다.py 파일의 내용은 다음과 같습니다.
import os

from django.core.wsgi import get_wsgi_application

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "NetWorkMonitor.settings")

application = get_wsgi_application()

루팅 수정.py 파일, EchoConsumer는 다음과 같은 웹 소켓의 응답 클래스입니다.
from django.urls import path
from channels.routing import ProtocolTypeRouter, URLRouter
from channels.auth import AuthMiddlewareStack
from WebSocket.consumers import EchoConsumer
application = ProtocolTypeRouter({

    "websocket": AuthMiddlewareStack(
        URLRouter([
            # URLRouter just takes standard Django path() or url() entries.
            path("websockettest/", EchoConsumer),
        ]),
    ),
})
url    websockettest.html    ,    js   websocket  ,    :
urlpatterns = [
    path('admin/', admin.site.urls),
    path('',AppMain_views.login),
    path('loginfunc/', AppMain_views.loginfunc, name='loginfunc'),
    path('websockettest/',AppMain_views.websockettest),
    path(r'^favicon\.ico$', RedirectView.as_view(url='/static/devifile_psp.ico')),
    url(r'^crossdomain.xml$',allow_domains,{
   'domains': ['172.20.0.42']}),
]
js   websocket  ,   :
socket = new WebSocket("ws://127.0.0.1:9873/websockettest/");
socket.onmessage = function(e) {
    if (socket.readyState == WebSocket.OPEN)
    {
        alert("success... content="+e.data);
    }
    else
    {
        alert("failed");
    }
    consoe.log(e.data);
}
socket.onopen = function() {
    socket.send("hello world");
}
         ,  websocket  ,  json       json.dumps,          :
 
  
class EchoConsumer(JsonWebsocketConsumer):

    def websocket_connect(self, event):
        self.accept()

    def websocket_receive(self, event):
        self.send(json.dumps({
            "type": "websocket.send supcon",
            "text": event["text"],
        }))


    def websocket_message(self, event):
        self.send(json.dumps({
            "type": "websocket.send jackie",
            "text": event["text"],
        }))

    def websocket_disconnect(self, event):
        self.send(json.dumps({
            "type": "websocket.send",
            "text": event["text"],
        }))

4
  ,        ,             websocket。
소스 코드 링크

좋은 웹페이지 즐겨찾기