Skip to content

Commit 43eb131

Browse files
committed
README.md is updated !
1 parent 2a1ad21 commit 43eb131

File tree

3 files changed

+772
-2
lines changed

3 files changed

+772
-2
lines changed

README.md

Lines changed: 276 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)