Django Custom Decorator Yazımı

Merhabalar,

Bu yazıda basitçe Django ile custom bir decorator nasıl yazılır? ondan bahsedeceğim. Decorator nedir? sorusunun cevabını yazı içerisinde vermeyeceğim. Bunun için http://ysar.net/python/decorator.html veya https://wiki.python.org/moin/PythonDecorators adreslerini ziyaret edebilirsiniz. Python'da decoratorleri anladıktan sonra Django viewleri için kısaca nasıl yazacağımızdan bahsedelim.

Bir örnek üzerinden gidecek olursak: Birden fazla api view'ı yazıyorsunuz ve her view içerisinde kullanıcıdan token gelmiş mi? Gelmiş ise geçerli bir token mı? gibi kontroller yapmaktasınız. Bu kontrolleri her view içerisinde tekrarlamaktan ise bir Decorator yardımı ile nasıl halledeceğimize bakalım.

from functools import wraps
import json

from django.http.response import JsonResponse
from django.utils.decorators import available_attrs

def custom_decorator(view_func):
    def wrapped_view(request, *args, **kwargs):
        if request.method == "POST":
            try:
                data = json.loads(request.body.decode('utf-8'))
            except ValueError:
                return JsonResponse({'message': 'Invalid JSON Parameters'})

            token = request_data.get('token', None)
            if not token:
                return JsonResponse({'message': 'Invalid token'})

            kwargs['data'] = data    
            return view_func(request, *args, **kwargs)
        return JsonResponse({'message': 'Invalid request type'})
    return wraps(view_func, assigned=available_attrs(view_func))(wrapped_view)

Decorator yazımı bu kadar basit. Bu şekilde kendi ihtiyaçlarınıza göre değişiklikler, kontroller yapıp kullanabilirsiniz. Yukarıda dikkat ettiyseniz kwargs'a data değişkenini atadık. Bu değişken decorator'ün kullanıldığı view(fonksiyon)'a parametre olarak gidecektir. view üzerinde kullanımı ise şu şekildedir.

@custom_decorator
def foo(request, data):
    pass

Kolay gelsin..