@@ -174,7 +174,7 @@ class Command(RunCommand):
174174 from geventwebsocket.handler import WebSocketHandler
175175
176176 websocket = True ;
177- print (' Gevent config is done !\n ' );
177+ print (' async_mode is set to `Gevent` !\n ' );
178178
179179 except ImportError :
180180 websocket = False ;
@@ -218,3 +218,278 @@ application = socketio.WSGIApp(sio, django_app);
218218<br />
219219<br />
220220
221+ ### Implémentation des exemples de fonctionnalités avec socket.io
222+ On va juste essayer d'implémenter un programme de chat. Remplacez donc tous le code contenu dans le fichier ` django_socketio/socketio_app/views.py ` par les lignes de code suivantes :
223+
224+ ``` python
225+ # définissez async_mode sur 'threading', 'eventlet', 'gevent' ou 'gevent_uwsgi' sur
226+ # forcer un autre mode, le meilleur mode est sélectionné automatiquement parmi ce qui est
227+ # installée
228+ async_mode = ' gevent' ;
229+
230+ import os
231+
232+ from django.http import HttpResponse
233+ import socketio
234+
235+ basedir = os.path.dirname(os.path.realpath(__file__ ));
236+ sio = socketio.Server(async_mode = async_mode);
237+
238+ # thread = None
239+ users = {};
240+
241+ def index (request ):
242+ """
243+ Programme qui permet de renvoiyer la page web `index`
244+ """
245+
246+ # global thread;
247+
248+ # if thread is None:
249+ # thread = sio.start_background_task(background_thread);
250+
251+ # on renvois une page WEB
252+ return HttpResponse(open (os.path.join(basedir, ' static/index.html' )));
253+
254+
255+ # def background_thread():
256+ # """ Exemple de programme d'execution de programme d'arriere plan """
257+
258+ # count = 0;
259+
260+ # while True:
261+ # sio.sleep(10);
262+ # count += 1;
263+ # sio.emit('my_response', {'data': 'Server generated event'}, namespace='/test');
264+
265+ @sio.event
266+ def set_username (sid , message ):
267+ """ Programme de modification du nom d'utilisateur """
268+ users[sid] = message[' data' ];
269+
270+ # on notifit que le username a ete correctement notifie
271+ sio.emit(' my_response' , {' data' : f " Username is set to { users[sid]} ! " }, to = sid);
272+
273+
274+
275+ @sio.event
276+ def my_event (sid , message ):
277+ # Programme qui permet d'envoyer le message a moi meme
278+ sio.emit(' my_response' , {' data' : message[' data' ]}, room = sid);
279+
280+
281+
282+ @sio.event
283+ def my_broadcast_event (sid , message ):
284+ # Programme qui permet d'envoyer le message a tous le monde
285+ sio.emit(' my_response' , {' data' : f " [ { users[sid]} ] { message[' data' ]} " });
286+
287+
288+
289+ @sio.event
290+ def join (sid , message ):
291+ """ Programme de creation et d'adesion de canale """
292+
293+ # on cree le canale et on se join a ce canal
294+ sio.enter_room(sid, message[' room' ]);
295+
296+ # sio.emit('my_response', {'data': 'Entered room: ' + message['room']}, room=sid);
297+
298+ # on emet a tous ceux qui sont dans le canal qu'on de
299+ # rejoindre le canal
300+ sio.emit(' my_response' , {' data' : ' Entered room: ' + message[' room' ]}, to = message[' room' ]);
301+
302+
303+ @sio.event
304+ def leave (sid , message ):
305+ """ Programme de deconnection d'un canal """
306+
307+ # on se deconnecte du canal
308+ sio.leave_room(sid, message[' room' ]);
309+ sio.emit(' my_response' , {' data' : users[sid] + ' left room: ' + message[' room' ]}, room = sid);
310+
311+
312+ @sio.event
313+ def close_room (sid , message ):
314+ """ Programme de fermeture d'un canal """
315+
316+ # on ferme le canal
317+ sio.close_room(message[' room' ]);
318+ sio.emit(' my_response' , {' data' : ' Room ' + message[' room' ] + ' is closing.' }, room = message[' room' ]);
319+
320+
321+ @sio.event
322+ def my_room_event (sid , message ):
323+ """ Programme qui permet d'envoyer un message a tous les membres du canal """
324+ sio.emit(' my_response' , {' data' : f " [ { users[sid]} ] { message[' data' ]} " }, room = message[' room' ]);
325+
326+
327+ @sio.event
328+ def disconnect_request (sid ):
329+ """ Programme qui declanche la deconnection de l'utilisateur """
330+ sio.disconnect(sid);
331+
332+
333+ @sio.event
334+ def connect (sid , environ ):
335+ """ Programme de connexion
336+ Au cour de la connexion, on enregistre tous les utilisateurs
337+ connectes
338+ """
339+
340+ print (f " { sid} \t connected " );
341+
342+ # on ajoute le nouveau a la liste
343+ users[sid] = None ;
344+
345+ # on lui notifie qu'il s'est bien connecte
346+ sio.emit(' my_response' , {' data' : ' Connected' , ' count' : len (users)}, room = sid);
347+
348+
349+ @sio.event
350+ def disconnect (sid ):
351+ """ Programme de deconnexion
352+ Lors de la deconnexion, on supprime l'utilisateur de la liste des
353+ connectes
354+ """
355+
356+ print (f " { sid} \t { users[sid]} disconnected " );
357+
358+ # on le supprime de la liste
359+ del users[sid];
360+
361+
362+ ```
363+
364+ <br />
365+ <br />
366+
367+ ### Mise en place d'une interface WEB
368+ Dans le dossier ` django_socketio/socketio_app/ ` , créez un dossier nommé ` static ` , ensuite, dans ce dernier, créer un fichier nommé ` index.html ` . Dans ce fichier, insérez les lignes de code suivantes :
369+
370+ ``` html
371+ <!DOCTYPE HTML>
372+ <html >
373+ <head >
374+ <title >Django + SocketIO Test</title >
375+ <script type =" text/javascript" src =" //code.jquery.com/jquery-3.2.1.slim.min.js" ></script >
376+ <script type =" text/javascript" src =" //cdnjs.cloudflare.com/ajax/libs/socket.io/3.0.3/socket.io.min.js" ></script >
377+ <script type =" text/javascript" charset =" utf-8" >
378+ $ (document ).ready (function (){
379+ var socket = io .connect ();
380+
381+ socket .on (' connect' , function () {
382+ socket .emit (' my_event' , {data: ' I\' m connected!' });
383+ });
384+ socket .on (' disconnect' , function () {
385+ $ (' #log' ).append (' <br>Disconnected' );
386+ });
387+ socket .on (' my_response' , function (msg ) {
388+ $ (' #log' ).append (' <br>Received: ' + msg .data );
389+ });
390+
391+ // event handler for server sent data
392+ // the data is displayed in the "Received" section of the page
393+ // handlers for the different forms in the page
394+ // these send data to the server in a variety of ways
395+ $ (' form#username' ).submit (function (event ) {
396+ socket .emit (' set_username' , {data: $ (' #name_data' ).val ()});
397+ return false ;
398+ });
399+ $ (' form#emit' ).submit (function (event ) {
400+ socket .emit (' my_event' , {data: $ (' #emit_data' ).val ()});
401+ return false ;
402+ });
403+ $ (' form#broadcast' ).submit (function (event ) {
404+ socket .emit (' my_broadcast_event' , {data: $ (' #broadcast_data' ).val ()});
405+ return false ;
406+ });
407+ $ (' form#join' ).submit (function (event ) {
408+ socket .emit (' join' , {room: $ (' #join_room' ).val ()});
409+ return false ;
410+ });
411+ $ (' form#leave' ).submit (function (event ) {
412+ socket .emit (' leave' , {room: $ (' #leave_room' ).val ()});
413+ return false ;
414+ });
415+ $ (' form#send_room' ).submit (function (event ) {
416+ socket .emit (' my_room_event' , {room: $ (' #room_name' ).val (), data: $ (' #room_data' ).val ()});
417+ return false ;
418+ });
419+ $ (' form#close' ).submit (function (event ) {
420+ socket .emit (' close_room' , {room: $ (' #close_room' ).val ()});
421+ return false ;
422+ });
423+ $ (' form#disconnect' ).submit (function (event ) {
424+ socket .emit (' disconnect_request' );
425+ return false ;
426+ });
427+ });
428+ </script >
429+ </head >
430+ <body >
431+ <h1 >Django + SocketIO Test</h1 >
432+ <h2 >Send:</h2 >
433+ <form id =" username" method =" POST" action =' #' >
434+ <input type =" text" name =" username" id =" name_data" placeholder =" Username" >
435+ <input type =" submit" value =" Set name" >
436+ </form >
437+ <form id =" emit" method =" POST" action =' #' >
438+ <input type =" text" name =" emit_data" id =" emit_data" placeholder =" Message" >
439+ <input type =" submit" value =" Echo" >
440+ </form >
441+ <form id =" broadcast" method =" POST" action =' #' >
442+ <input type =" text" name =" broadcast_data" id =" broadcast_data" placeholder =" Message" >
443+ <input type =" submit" value =" Broadcast" >
444+ </form >
445+ <form id =" join" method =" POST" action =' #' >
446+ <input type =" text" name =" join_room" id =" join_room" placeholder =" Room Name" >
447+ <input type =" submit" value =" Join Room" >
448+ </form >
449+ <form id =" leave" method =" POST" action =' #' >
450+ <input type =" text" name =" leave_room" id =" leave_room" placeholder =" Room Name" >
451+ <input type =" submit" value =" Leave Room" >
452+ </form >
453+ <form id =" send_room" method =" POST" action =' #' >
454+ <input type =" text" name =" room_name" id =" room_name" placeholder =" Room Name" >
455+ <input type =" text" name =" room_data" id =" room_data" placeholder =" Message" >
456+ <input type =" submit" value =" Send to Room" >
457+ </form >
458+ <form id =" close" method =" POST" action =" #" >
459+ <input type =" text" name =" close_room" id =" close_room" placeholder =" Room Name" >
460+ <input type =" submit" value =" Close Room" >
461+ </form >
462+ <form id =" disconnect" method =" POST" action =" #" >
463+ <input type =" submit" value =" Disconnect" >
464+ </form >
465+ <h2 >Receive:</h2 >
466+ <div ><p id =" log" ></p ></div >
467+ </body >
468+ </html >
469+
470+ ```
471+
472+ <br />
473+ <br />
474+
475+ ## Démarrage du serveur
476+ N'oublier pas de sauvegarder tous les fichiers sources. Il est temps de tester notre programme.
477+ On doit d'abord faire un migration dans une base de données avant de démarrer le serveur.
478+ Pour faire la migration, tappez la commande suivante :
479+
480+ ```
481+ ./manage.py migrate
482+ ```
483+
484+ On peut maintenant démarrer le serveur avec la commande suivante :
485+
486+ ```
487+ ./manage.py runserver
488+ ```
489+
490+ Si tout va bien, vous verrez le message suivant affichez dans votre terminal.
491+
492+ ```
493+ async_mode is set to `Gevent` !
494+ ```
495+
0 commit comments