Monthly Archives: Mart 2014

Genel

Django Framework Üzerinde Sinyal Kullanımı

Django, sinyaller vasıtasıyla uygulama genelinde meydana gelen herhangibir olayı, sinyali dinleyen alıcılara bildirir. Geliştiriciler, djanog ile birlikte gelen hali hazırdaki sinyalleri kullanabildikleri gibi (Bkz. Django ile birlikte gelen hali hazırda sinyaller) kendileri de geliştirdikleri uygulamaya özel sinyaller tanımlayabilirler.

Django uygulamalarında sinyaller, alıcılar vasıtasıyla dinlenir. Django dünyasında alıcılar, bilindik python fonksiyonlarıdır.

Farzı misal bakınız bir sinyal alıcısı:

from django.core.signals import request_finished
from django.dispatch import receiver

@receiver(request_finished)
def my_callback(sender, **kwargs):
    print("Request finished!")

Alıcıları, @receiver dekoratörü ile sinyallere bağlayabildiğiniz gibi

request_finished.connect(my_callback)

şeklinde de bağlayabilirsiniz.

Kullanıcı Tanımlı Sinyaller:

Django, bizlere http isteklerinin durumu ve veritabanı işlemleri ile ilgili dahili sinyaller sağlıyor. Ancak bazı durumlarda geliştirdiğiniz uygulamaya spesifik bazı özel sinyaller tanımlamanız gerekebilmektedir. Böyle durumlarda sizler de Django nun django.dispath modülünde yeralan Signal sınıfını kullanabilirsiniz.

Sinyal tanımlamalarını ilgili uygulamanın altında signals.py dosyası içinde gerçekleştirilir.

Aşağıdaki örnekte, e-ticaret uygulamamızın sipariş tamamlandığında order_completed sinyalini tetiklemesini sağlıyoruz.

öncelikle order_completed sinyalini tanımlayalım:

# order/signals.py

import django.dispath

order_completed = django.dispath.Signal(providing_args=['order'])

Şimdi de sipariş tamamlandığında bu olayı tetikleyelim.

# order/services.py

from order.signals import order_completed

class OrderManager(object):
    def create_order(self, *args, **kwargs):
        # siparisle ilgili islemler...
        #
        # yeni siparis yaratiliyor.
        order = Order.objects.create(order_nr='00001234')

        # ...ve siparis tamamlandi olayini tetikliyoruz.
        order_completed.send(sender=self, order=order)
        return order

Herhangibir sipariş geldiğinde, sipariş order tablosuna yazıldıktan hemen sonra order_completed sinyalinin gönderildiğini görebiliyoruz. Artık diledğimiz bir veya daha fazla alıcı ile bu sinyali dinleyerek bu sinyalle ilgili herhangibir işlemi gerçekleştirebiliriz. Yeri gelmişken Django uygulamalarında sinyallerin senkron çalıştığını söylemekte yarar var. Alıcı tarafında meydana gelen herhangibir darboğaz veya hata, uygulamanın yavaşlamasına veya kırılmasına neden olabilir.

Şimdi de aynı örnek için order_completed olayını dinleyen bir alıcı kodlayalım. Alıcılar konusunda malesef standart bir yaklaşım yok. İnternette görebileceğiniz örneklerde alıcılar şayet modelle ilgili bir alıcıysa ilgili olduğu uygulamının models.py dosyasına sinyal konusu olan model sınıfının hemen altına yazılıyor.

Şahsi görüşüm, sinyal alıcılarının business logic içermesi ve modelle ilgisinin sadece kendisiyle olan bağ olması nedeniyle ayrı bir yerde tutulması gerektiği yönünde. Bu nedenle ben, yeraldığım projelerde sinyal alıcılarını ilgili uygulamanın altında receivers.py içinde barındırmayı tercih ediyorum. Tabi bu durumda alıcıların uygulama genelinde işlevlerini yerine getirebilmeleri için merkezi biryerlerde import edilmeleri gerektiğinden import işlemini urls.py içerisinde gerçekleştiriyorum.

Aşağıdaki örnek alıcı, sipariş tamamlandığında yöneticiye sipariş tamamlandı maili gönderir.

# order/receivers.py

from django.dispatch import receiver
from django.core.mail import mail_admins
from order.signals import order_completed

@receiver(order_completed, 
          dispatch_uid="order.receivers.send_order_notification")
def send_order_notification(sender, order, **kwargs):
    mail_admins(subject='order completed #%s' % order.order_nr,
                message='Received a new order from site. '
                'New order number is: #%s' % order.order_nr)

Alıcının işlevini yerine getirebilmesi için urls.py dosyasında recivers.py ın içerdiği alıcıları import ediyoruz.

# urls.py

from order.receivers import *

# ...

Detaylı bilgi için Django Framework dökümantasyonundaki ilgili bölümü inceleyebilirsiniz.

Genel

PHPKonf’dan Yeni Bir Workshop Etkinliği


12 Nisan 2014 Cumartesi günü kimselere söz vermeyin, zira oturup hep beraber kod yazacağız. :)

PHPKonf:Workshop etkinliğinde, Laravel Framework ekseninde aşağıdaki oturumlar gerçekleştirilecek:

Laravel’e Giriş – Emir Karşıyakalı
Eloquent ORM – Arda Kılıçdağı
Test-driven development(PHPUnit) – Osman Yüksel
Elasticsearch – Hüseyin Mert
Gruntjs – Fatih Kadir Akın
AngularJS – İsmail Baskın

ve bendeniz İbrahim Gündüz Tasarım Desenleri ile ilgili bir oturumda yeralacağım.

Eğer sizin için de “nasıl gidiyor ??” sorusunun cevabı “yazıp çiziyoruz…” ise 12 Nisan 2014 Cumartesi günü sizleri de dizüstü bilgisayarınızla birlikte aramızda görmekten mutluluk duyarız. Gelişmeleri https://twitter.com/phpkonf twitter hesabından takip edebilirsiniz.