djangoʵʱͨѶ--channels2.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({ ×îºóÔÚ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 ] ÏîĿĿ¼½á¹¹ÈçÏ£º Èý¡¢±àд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 )
<span style="color: #000000;"> await self.channel_layer.group_discard(
<span style="color: #000000;"> await self.channel_layer.group_send(
ÒÔÉÏ´úÂ벿·Ö˵Ã÷£º 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;">function</span><span style="color: #000000;"> (e) {
</span><span style="color: #0000ff;">var</span> data =<span style="color: #000000;"> JSON.parse(e.data);
</span><span style="color: #0000ff;">var</span> message = 'n' + data['message'<span style="color: #000000;">];
document.querySelector(</span>'#deploy-res').innerText += (message + 'n'<span style="color: #000000;">);
};
}</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½øÐÐÉú²ú²¿Êð¡£ ?? £¨±à¼£ºÀî´óͬ£© ¡¾ÉùÃ÷¡¿±¾Õ¾ÄÚÈݾùÀ´×ÔÍøÂ磬ÆäÏà¹ØÑÔÂÛ½ö´ú±í×÷Õ߸öÈ˹۵㣬²»´ú±í±¾Õ¾Á¢³¡¡£ÈôÎÞÒâÇÖ·¸µ½ÄúµÄȨÀû£¬Ç뼰ʱÓëÁªÏµÕ¾³¤É¾³ýÏà¹ØÄÚÈÝ! |
- LuaÖ®pairsºÍipairsµÄÇø±ð
- laravel´î½¨²©¿ÍʵսµÄ½Ì³ÌʵÀý
- ÈçºÎÔÚDelphiÖлñÈ¡ÆÁÄ»µÄ¿ÉÓÃ×ø±ê
- °²×°Á½¸öBCB6¿Ø¼þSynEdit¡¢mwEdit 0.92aµÄ¹ý³Ì×ܽá
- luaºÍcµÄÇ×ÃܽӴ¥
- golang»ñȡһ´®Êý×ÖÖÐÓë¸ø¶¨Êý×î½Ó½üµÄÊý×Ö
- Perl ::ÅúÆÀ¼Ò£º÷繺óµÄÉú»î£¿
- vb.net datagridview ʹÓ÷½·¨
- ÈçºÎÔÚʹÓá¯/usr/bin/env perl¡¯ÔËÐнű¾Ê±ÕÒ³öÎÒÕýÔÚʹÓÃ
- delphi ¨C TWordApplicationºÍWordÅöײ