¼ÓÈëÊÕ²Ø | ÉèΪÊ×Ò³ | »áÔ±ÖÐÐÄ | ÎÒҪͶ¸å Àî´óͬ £¨https://www.lidatong.com.cn/£©- ¿Æ¼¼¡¢½¨Õ¾¡¢¾­Ñé¡¢ÔƼÆËã¡¢5G¡¢´óÊý¾Ý,Õ¾³¤Íø!
µ±Ç°Î»Ö㺠Ê×Ò³ > ´óÊý¾Ý > ÕýÎÄ

djangoʵʱͨѶ--channels2.xʹÓÃ

·¢²¼Ê±¼ä£º2020-12-15 17:16:44 ËùÊôÀ¸Ä¿£º´óÊý¾Ý À´Ô´£ºÍøÂçÕûÀí
µ¼¶Á£ºÒ»¡¢±³¾° ÔÚ×î½üµÄÏîÄ¿ÖеÄÒ»¸öÐèÇóÊÇÏûϢʵʱÍÆËÍÏûÏ¢ÒÔ¼°Í¨Öª¹¦ÄÜ£¬ÏîĿʹÓÃdjangoдµÄËùÒÔ¾ö¶¨²ÉÓÃdjango-channelsÀ´ÊµÏÖwebsocket½øÐÐʵʱͨѶ¡£Ä¿Ç°¹Ù·½ÒѾ­¸üе½2.1°æ±¾£¬Ïà¶ÔÓÚÀϵÄchannels 1.x°æ±¾ÓÐÁ˺ܴó±ä»¯£¬ÎÞÂÛÊÇʹÓ÷½Ê½»¹Êǹ¦ÄÜ£¬ÆäÖÐ×î´ó

Ò»¡¢±³¾°

¡¡¡¡ÔÚ×î½üµÄÏîÄ¿ÖеÄÒ»¸öÐèÇóÊÇÏûϢʵʱÍÆËÍÏûÏ¢ÒÔ¼°Í¨Öª¹¦ÄÜ£¬ÏîĿʹÓÃdjangoдµÄËùÒÔ¾ö¶¨²ÉÓÃdjango-channelsÀ´ÊµÏÖwebsocket½øÐÐʵʱͨѶ¡£Ä¿Ç°¹Ù·½ÒѾ­¸üе½2.1°æ±¾£¬Ïà¶ÔÓÚÀϵÄchannels 1.x°æ±¾ÓÐÁ˺ܴó±ä»¯£¬ÎÞÂÛÊÇʹÓ÷½Ê½»¹Êǹ¦ÄÜ£¬ÆäÖÐ×î´óµÄ±ä»¯Äª¹ýÓÚ2.x°æ±¾ÖдøÀ´µÄasyncioÌØÐÔ£¬¿ÉʹÓÃÒì²½´¦Àíģʽ¡£±¾ÎÄÄÚÈݽ«½éÉÜchannels2°æ±¾Ê¹Óã¬ÓÉÓÚÏîÄ¿djangoÊÇ1.11,ÆäÖÐÒ²Óöµ½ÁËһЩ¿Ó£¬±ÈÈçÔÚchannelsÔÚ´¦ÀíÒ»´ÎÇëÇóºóhangסȻºó±¨´í£¬ºóÃæÐÞ¸ÄÁËÏÂdjango1.11°æ±¾µÄÒ»µãÔ´ÂëµÃÒÔ½â¾ö£¬2.0°æ±¾Ó¦¸Ã²»»áÓÐÎÊÌâ¡£

¶þ¡¢channels½éÉÜ

¡¡¡¡channelsÊÇÒÔdjango²å¼þµÄÐÎʽ´æÔÚ£¬Ëü²»½öÄÜ´¦ÀíhttpÇëÇ󣬻¹Ìṩ¶Ôwebsocket¡¢MQTTµÈ³¤Á¬½ÓÖ§³Ö¡£²»½öÈç´Ë£¬channelsÔÚ±£ÁôÁËÔ­ÉúdjangoµÄͬ²½ºÍÒ×ÓõÄÌØÐÔÉÏ»¹´øÀ´ÁËÒì²½´¦Àí·½Ê½(channels2.X°æ±¾)£¬²¢ÇÒ½«django×Ô´øµÄÈÏ֤ϵͳÒÔ¼°session¼¯³Éµ½Ä£¿éÖУ¬À©Õ¹ÐԷdz£Ç¿¡£¹Ù·½Îĵµ£ºhttps://channels.readthedocs.io/en/latest/index.html

Èý¡¢°²×°ÒÔ¼°°²×°ÐèÇó

¡¡¡¡channels2.0×îµÍdjango°æ±¾ÒªÇóÊÇ1.11+£¬python3.5+¡£±ÊÕߵİ汾ÊÇdjango1.11£¬Ö±½Ó°²×°¿ÉÄÜÓÐÎÊÌ⣬ÒÔÏÂÊDzâÊÔͨ¹ýµÄ°æ±¾¡£

±ÊÕßµÄÏà¹Ø°æ±¾ÈçÏ£º

Django==1.11.10==2.1.4-redis==2.3.1==2.1.6-redis==1.4.3

Èç¹ûdjango°æ±¾±È½Ï¸ßÖ±½Ó²ÉÓÃpip°²×°£º

-redis

redis°²×°¿ÉÒԲο¼²©¿Í£ºhttps://www.cnblogs.com/wdliu/p/9360286.html

ËÄ¡¢¿ªÊ¼Ê¹ÓÃ

Ò»¡¢ÅäÖÃsettings.py

¡¡¡¡±ÊÕß²ÉÓõÄredis×÷Ϊchannel layer(¹ØÓÚÆä½éÉÜÇëÒƲ½ÖÁhttps://channels.readthedocs.io/en/latest/topics/channel_layers.html),ËüÊÇʵÏÖÏûÏ¢ÍÆË͵ĺËÐÄ£¬ÔÚÏîÄ¿µÄsettings.pyÖУº

×¢²áchannles app£º

INSTALLED_APPS =, ]

ÅäÖÃchannels layer£º

ASGI_APPLICATION = =: : [(,6379)],

¶þ¡¢Â·ÓÉÅäÖÃ

ÔÚÏîÄ¿settingsÎļþͬ¼¶Ä¿Â¼ÖÐÐÂÔörouting.py

<span style="color: #0000ff;">from channels.auth <span style="color: #0000ff;">import<span style="color: #000000;"> AuthMiddlewareStack
<span style="color: #0000ff;">from channels.routing <span style="color: #0000ff;">import<span style="color: #000000;"> ProtocolTypeRouter,URLRouter
<span style="color: #0000ff;">import<span style="color: #000000;"> deploy.routing

application =<span style="color: #000000;"> ProtocolTypeRouter({
<span style="color: #800000;">'<span style="color: #800000;">websocket<span style="color: #800000;">'<span style="color: #000000;">: AuthMiddlewareStack(
URLRouter(
deploy.routing.websocket_urlpatterns<span style="color: #008000;">#<span style="color: #008000;"> Ö¸Ã÷·ÓÉÎļþÊÇdevops/routing.py
<span style="color: #000000;"> )
),})

×îºóÔÚappÀïÅäÖ÷ÓɺͶÔÓ¦µÄÏû·ÑÕߣ¬±ÊÕßÕâÀïÊÇdevopsϵÄrouting.py£º

django.conf.urls <span style="color: #0000ff;">from . <span style="color: #0000ff;">import<span style="color: #000000;"> consumers

websocket_urlpatterns =<span style="color: #000000;"> [
url(r<span style="color: #800000;">'<span style="color: #800000;">^ws/deploy/(?P[^/]+)/$<span style="color: #800000;">',consumers.DeployResult),<span style="color: #008000;">#<span style="color: #008000;">consumers.DeployResult ÊǸ÷ÓɵÄÏû·ÑÕß
]

ÏîĿĿ¼½á¹¹ÈçÏ£º

Èý¡¢±àдwebscoketÏûÏ¢´¦Àí·½·¨(Ïû·ÑÕß)

deploy/consumers.py£º

<span style="color: #0000ff;">from channels.generic.websocket <span style="color: #0000ff;">import<span style="color: #000000;"> AsyncWebsocketConsumer
<span style="color: #0000ff;">import<span style="color: #000000;"> json

<span style="color: #0000ff;">class<span style="color: #000000;"> DeployResult(AsyncWebsocketConsumer):
async <span style="color: #0000ff;">def<span style="color: #000000;"> connect(self):
self.service_uid = self.scope[<span style="color: #800000;">"<span style="color: #800000;">url_route<span style="color: #800000;">"][<span style="color: #800000;">"<span style="color: #800000;">kwargs<span style="color: #800000;">"][<span style="color: #800000;">"<span style="color: #800000;">service_uid<span style="color: #800000;">"<span style="color: #000000;">]
self.chat_groupname = <span style="color: #800000;">'<span style="color: #800000;">chat%s<span style="color: #800000;">' %<span style="color: #000000;"> self.service_uid
<span style="color: #008000;">#<span style="color: #008000;"> ÊÕµ½Á¬½Óʱºò´¦Àí£¬
<span style="color: #000000;"> await self.channel_layer.group_add(
self.chat_group_name,self.channel_name
)

    await self.accept()

async </span><span style="color: #0000ff;"&gt;def</span><span style="color: #000000;"&gt; disconnect(self,close_code):
    </span><span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; ¹Ø±Õchannelʱºò´¦Àí</span>

<span style="color: #000000;"> await self.channel_layer.group_discard(
self.chat_group_name,self.channel_name
)

</span><span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; ÊÕµ½ÏûÏ¢</span>
async <span style="color: #0000ff;"&gt;def</span><span style="color: #000000;"&gt; receive(self,text_data):
    text_data_json </span>=<span style="color: #000000;"&gt; json.loads(text_data)
    message </span>= text_data_json[<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;message</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;]
    </span><span style="color: #0000ff;"&gt;print</span>(<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;ÊÕµ½ÏûÏ¢--¡·</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;,message)
    </span><span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; ·¢ËÍÏûÏ¢µ½×é</span>

<span style="color: #000000;"> await self.channel_layer.group_send(
self.chat_group_name,{
<span style="color: #800000;">'<span style="color: #800000;">type<span style="color: #800000;">': <span style="color: #800000;">'<span style="color: #800000;">client.message<span style="color: #800000;">'<span style="color: #000000;">,<span style="color: #800000;">'<span style="color: #800000;">message<span style="color: #800000;">'<span style="color: #000000;">: message
}
)

</span><span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; ´¦Àí¿Í»§¶Ë·¢À´µÄÏûÏ¢</span>
async <span style="color: #0000ff;"&gt;def</span><span style="color: #000000;"&gt; client_message(self,event):
    message </span>= event[<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;message</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;]
    </span><span style="color: #0000ff;"&gt;print</span>(<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;·¢ËÍÏûÏ¢¡£¡£¡£</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;,message)
    </span><span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; ·¢ËÍÏûÏ¢µ½ WebSocket</span>
    await self.send(text_data=<span style="color: #000000;"&gt;json.dumps({
        </span><span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;message</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;: message
    }))</span></pre>

ÒÔÉÏ´úÂ벿·Ö˵Ã÷£º

1.self.scopeÊǵ¥¸öÁ¬½Ó´«ÈëµÄÏêϸÐÅÏ¢£¬ÆäÖаüº¬ÁËÇëÇóµÄsession¡¢ÒÔ¼°djangoÈÏ֤ϵͳÖеÄÓû§ÐÅÏ¢µÈ£»

2.async...await ÊÇpython3.5Ö®ºóµÄÐÂÒì²½ÌØÐÔ£¬»ùÓÚasyncioÄ£¿é£»

ËÄ¡¢·¢ÆðwebscoketÇëÇó

ÀûÓÃjs·¢ÆðwebsocketÇëÇó

websocket = 'ws://' + window.location.host + '/ws/deploy/tasks/' websocket.onmessage </span>= <span style="color: #0000ff;"&gt;function</span><span style="color: #000000;"&gt; (e) { </span><span style="color: #0000ff;"&gt;var</span> data =<span style="color: #000000;"&gt; JSON.parse(e.data); </span><span style="color: #0000ff;"&gt;var</span> message = 'n' + data['message'<span style="color: #000000;"&gt;]; document.querySelector(</span>'#deploy-res').innerText += (message + 'n'<span style="color: #000000;"&gt;); }; }</span></pre>

Îå¡¢·¢ËÍÏûÏ¢µ½channel

ÎÞÂÛÊÇÏûÏ¢µÄÍÆËÍ»òÕßÏûÏ¢µÄ½ÓÊÜ£¬¶¼ÊǾ­¹ýchannel layer½øÐд«Ê䣬ÒÔÏÂÊÇ·¢ËÍÏûϢʾÀý£¬

channel_layer =<span style="color: #000000;"> get_channel_layer()
def send_channel_msg(channel_name,msg):
"""<span style="color: #000000;">
send msg to channel
:param channel_name:
:param msg:
:return:
"""<span style="color: #000000;">
async_to_sync(channel_layer.group_send)(channel_name,{"type": "deploy.run","text": msg})

Áù¡¢Éú²ú²¿Êð

´ó¶àÊýdjangoµÄÓ¦Óò¿Êð·½Ê½¶¼²ÉÓõÄÊÇnginx+uwsgi½øÐв¿Ê𣬵±django¼¯³Échannelsʱºò£¬ÓÉÓÚuwsgi²»ÄÜ´¦ÀíwebsocketÇëÇó£¬ËùÒÔÎÒÃÇÐèÒªasgi·þÎñÆ÷À´´¦ÀíwebsocketÇëÇ󣬹ٷ½ÍƼöʹÓÃdaphne¡£ÏÂһƪÎÄÕ½«½éÉÜnginx+supervisor+daphne+uwsgi½øÐÐÉú²ú²¿Êð¡£

??

£¨±à¼­£ºÀî´óͬ£©

¡¾ÉùÃ÷¡¿±¾Õ¾ÄÚÈݾùÀ´×ÔÍøÂ磬ÆäÏà¹ØÑÔÂÛ½ö´ú±í×÷Õ߸öÈ˹۵㣬²»´ú±í±¾Õ¾Á¢³¡¡£ÈôÎÞÒâÇÖ·¸µ½ÄúµÄȨÀû£¬Ç뼰ʱÓëÁªÏµÕ¾³¤É¾³ýÏà¹ØÄÚÈÝ!

    ÍƼöÎÄÕÂ
      ÈȵãÔĶÁ