Django ve Socket.io ile Gerçek Zamanlı Uygulamalar – 3. Bölüm

Merhabalar,

Merhaba Dünya django uygulamamızı yaptıktan sonra, sırada gevent ve gevent-socketio kurulumu var. Nedir gevent-socketio? Socket-io protokolünün python dilinde uygulanmasıdır. Yazacağımız django uygulamasının Node.js nin yerini almasını sağlamaktadır. Hızlıca kuruluma geçiyoruz.

# Kurulumu pip ile yapıyoruz.
pip install gevent==0.13.8
pip install git+git://github.com/abourget/gevent-socketio
pip install git+git://github.com/abourget/gevent-websocket

Şimdi sırada djangoyu gevent ile çalıştıracak python betiğini sistemimize ekleyelim.
run.py isimli bir dosya oluşturalım.

run.py
#########################################
#!/usr/bin/env python
from gevent import monkey
from socketio.server import SocketIOServer
import django.core.handlers.wsgi
import os
import sys

# Bu ifade sayesinde django üzerinde ki iletişimi standart kütüphane yerine
# gevent tarafından yapılamasını sağlamaktadır.
# Ayrıntılı bilgi için: http://www.gevent.org/gevent.monkey.html
monkey.patch_all()

try:
  from malwarez import settings
except ImportError:
  sys.stderr.write("Error: Can not find the file 'settings.py'")
  sys.exit(1)

PORT = 8000
os.environ['DJANGO_SETTINGS_MODULE'] = 'socketIO_Test.settings'
application = django.core.handlers.wsgi.WSGIHandler()

if __name__ == '__main__':
  print 'Listening on http://127.0.0.1:%s and on port 843 (flash policy server)' % PORT
  SocketIOServer(('', PORT), application, resource="socket.io").serve_forever()

#########################################

python run.py ile djangoyu çalıştırıyoruz. Bundan sonra Djangoyu çalıştırmak için “python manage.py runserver” komutunu kullanmayacağız.

Eğer bir sorun ile karşılaşmazsanız, http://127.0.0.1:8000/ adresine giriş yaptığınızda yine Merhaba Dünya yazısını göreceksiniz.

Şimdi socket.io için kullanacağımız sunucu bölümünü yazalım. Hatırlarsanız, 1. Bölümde sunucuya bağlanmak için ‘var socket = io.connect(‘/chat’);’ komutunu kullanmıştık. Buradaki /chat ifadesi sunucu üzerinde bağlanılacak kanalı nitelendirmektedir. Yazacağımız sunucu kodunda yapmamız gerekecek ilk şey BaseNamespace sınıfından türeyen bir sınıf yazmamız olacaktir. Bu sınıfı hangi kanal ile ilişkilendirileceğini @namespace(‘/chat’) ifadesi ile belirtiyoruz. Bu sayede /chat kanalına bağlanan tüm istemciler bu sınıf tarafından yönetilecektir.

İstemci tarafında mesaj gönderirken şöyle bir fonksiyon kullanıyorduk. “socket.emit(‘subscribe’ , {‘me’: ‘mynick’});” Parametreleri inceleyelim. “subscribe” parametresi gönderilen mesajın etiketi olarak düşünülebilir, “{‘me’: ‘mynick’}” ise mesajın içeriğidir. Sunucu tarafında gelecek “subscribe” etiketli mesajı işlemek için on_subscribe(self, msg) imzalı bir method yazmamız yeterlidir. gevent-socketio kütüphanesi gelen mesajların etiketlerine göre on_{etiket}(self, msg) fonksiyonunu otomatik olarak çalıştırıyor.

Örnek sunucu kodumuz aşağıdadır.

web/sockets.py
#########################################
from socketio.namespace import BaseNamespace
from socketio.mixins import BroadcastMixin
from socketio.sdjango import namespace

@namespace('/chat')
class ChatNamespace(BaseNamespace, BroadcastMixin):
  client_num=0

  def on_subscribe(self, msg):
    print 'yeni kullanici: ', msg
    self.emit('welcome', '%d numarali istemcisiniz.'%(self.client))
    self.emit('message', 'socketIO_Test projesinden bir mesaj geldi...'%(self.client))

  def on_update(self, msg):
    print 'guncelleme bilgisi geldi. ', msg
    self.emit('message', msg)
#########################################

Bu işi tamamladıktan sonra socketIO_Test/urls.py dosyasını güncellememiz gerekmektedir.

socketIO_Test/urls.py
#########################################
from django.conf.urls import patterns, include, url
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
from socketio import sdjango

sdjango.autodiscover()

urlpatterns = patterns('',
url(r'^$', 'web.views.index'),
url(r'^socket\.io', include(sdjango.urls)),
)
urlpatterns += staticfiles_urlpatterns()
#########################################

web/static klasörü içersine socket.io.min.js dosyasını koymamız gerekmektedir. Ayrıca ilk yazımızda anlatılan kodları test-soclet.io.js adıyla web/static/ klasörüne kaydetmemiz gerekmektedir.

Son olarak index.html sayfamızı güncelliyoruz.

web/templates/index.html
#########################################
<html>
<head>
<script type="text/javascript" src="static/socket.io.min.js"></script>
<script type="text/javascript" src="static/test-socket.io.js"></script>
</head>
<body>
{{hello_text}}
<br/>
<textarea id="log" style="width: 400px; height: 600px;"></textarea>
</body>
</html>
#########################################

Projeyi aşağıdaki linkten indirebilirsiniz.

https://github.com/ggercek/ornekler/tree/master/python/socketIO_Test

Bir sonraki yazı da hazırladığımız bu sisteme python kullanarak nasıl bir istemci ile bağlanabileceğimize değineceğim.

Tagged with: , ,
Posted in yakindanegitim

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Archives
%d bloggers like this: