Dekoratör Fonksiyonlar

1 Yorum, 06 Şubat 2018 09:40, by Cenk Tuna, in

Python’da dekoratörler, parametre olarak bir fonksiyon alan ve bunu süzgeçten geçirip aynı fonksiyonun değerini return eden kalıplardır. Bunu gerçekleştiren fonksiyonlara da dekoratör fonksiyonlar denilir. Çeşitli kaynaklarda çok daha sofistike tanımlar bulunabilir. Ancak özellikle kullanımı açısından en basit tanımı böyledir.

Python'daki her şey gibi, fonksiyonlar da birer objedir ve bu nedenle fonksiyonlar diğer fonksiyonlara argüman olarak verilebilir veya fonksiyonlardan döndürülebilir. Bu durum fonksiyonlara ve metotlara  önemli işlevsellikler katar.

Dekoratörler, kodumuzu daha temiz ve okunabilir kılar. Özellikleri, konfigleri veya ön işlemleri okunabilir yapmak için etkili ve güzel bir yoldur. Türkçedeki kelime anlamı açısından bakıldığında(süsleme amacıyla düzen vermek) gerçek amaçlarından birinin de bu olduğu görülüyor.

Sık sık tekrarlanan işlemlerin tek noktada gerçekleştirilmesi açısından da avantajlıdır. Bu sayede farklı yerlerdeki çalışma mantığında değişiklikler yapılabilir. Bununla birlikte çıkan hataları bir çok yerde değiştirmekten de kurtulmuş olunur.

decorators.py

from django.http import HttpResponseRedirect, HttpResponse
class Decorators:
    @staticmethod
    def login_required(fn):
        def check(request):
            username = request.session.get("username")
            if username is None:
                return HttpResponseRedirect("/login/")
            return fn(request)
        return check


views.py

from helper.decorators import Decorators
decorator = Decorators()

@decorator.login_required
def create_customer(request):
    …

@decorator.login_required
def delete_customer(request):
    …

Yukarıdaki örnekte, bir django projesinde View katmanına gelen isteklerden önce kullanıcı kontrolü için bir dekoratör tanımlandı. İş mantığını yönettiğimiz bu katmanda fonksiyonu yerine getirmek için kullanıcının sisteme giriş yapmış olması gerekliliği tanımlandı. Kullanıcı giriş yapmışsa istek çalıştırılıyor; yapmamışsa, giriş sayfasına yönlendiriliyor.

Dekoratör bir metodun hemen üzerinde @decorator_name şeklinde kullanılır.  Aslında yaptığı tam olarak decorator.login_required(create_customer(request))  diyerek bir metodu başka bir metoda parametre olarak göndermektir.

Aynı yapıda farklı izin düzeylerindeki kullanıcıların yetkilendirme işlevlerini yürütmek de mümkündür. Bunun için Decorators sınıfı içinde yeni kurallar tanımlanır ve kullanılmak istenen yere örnekteki gibi yerleştirilir.

Bir sınıf içinde dekoratör tanımlama, argüman aktarma ve bu işlemlerin ayrı bir sınıf içinde kullanımı gösterilmiş oldu. Dekoratörler kullanılarak birçok konuda çözümler üretilebilir. Bu kadarı kullanım için yeterli olsa da özellikle OOP’nin derinliklerine inerek daha etkin ve daha şık kodlar geliştirilebilir. 
 

Yazar Hakkında

1 Yorum

16 Şubat 2018 12:20

Redirect için Redirect(url_for('classismi')) de kullanılabilir.

Yorumunuzu Paylaşırsanız seviniriz.

Girdiğiniz e-posta adresi kimseyle paylaşılmaz. Sadece kimlik olarak kullanılır.