Python+Django+channels 웹소켓 구현
프로젝트 버전:
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。
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.