Django Rest Framework DRF bir web API çatısıdır ve Django projelerinde hızlı ve verimli bir API oluşturmak için kullanılır DRF, standart Django özelliklerinin yanı sıra, temel autentication, test desteği, serialization ve daha birçok özelliği sunar Bu makalede, DRF nedir ve neden kullanılması gerektiği hakkında detaylı bilgi bulabilirsiniz
Django Rest Framework (DRF), Django web çerçevesi için bir RESTful API çatısıdır. DRF, web API'lerinin yapılandırılması için bir dizi kullanışlı araç sağlamaktadır. Django'nun sağladığı güçlü veritabanı modelleri, DRF ile API'lerin hızlı bir şekilde oluşturulabilmesini ve yapılandırılabilmesini sağlar. DRF, REST mimarisine uygun olarak tasarlanmıştır ve API'lerin sözleşmesel ve olası hatalarını kolayca yönetilebilmesini sağlar, ayrıca otomatik belgelendirme gibi yararlı özellikleri içerir.
DRF, çevik geliştirme için ideal bir araçtır. Django ve diğer Python kütüphaneleriyle uyumlu çalışabilmesi, büyük projelerde bile yüksek performans ve ölçeklenebilirlik sağlar. Ayrıca, API belgelendirmesinin otomatik olarak oluşması, özel doğrulama ve izinlerin kolayca yapılandırılabilmesi, üretim hazır API'lerin hızlı bir şekilde inşa edilmesini sağlar. Kısacası, DRF, web geliştiricileri için RESTful web API'leri oluşturmak için güvenilir bir araçtır.
API ve REST Kavramları
API, Application Programming Interface kelimelerinin kısaltmasıdır. API, farklı programlar arasındaki iletişimi sağlamak için kullanılır. Bu iletişim için belirli bir protokol kullanılır ve işlemler belirli bir formatta verilir.
REST ise, Representational State Transfer kelimelerinin kısaltmasıdır. REST, HTTP üzerinden veri gönderme işlemini yapar. Bu şekilde, böyle bir işlem yapan daha iyi bir uygulama ortaya çıkar. REST, sunucudan gelen response verisi ile istemci arasında daha etkili bir iletişim sağlar. REST API ile, uygulama arayüzü daha esnek ve daha yüksek performanslı hale getirilebilir.
REST API, uygulamanın bir parçası olarak bir API sunucu tarafından veri sağlar. REST API, modern bir uygulamanın daha olgun olmasına izin veren bir tür veri deposu olarak düşünülebilir. REST API, programlama dili ve platform farklılıklarına rağmen uygulama geliştiricileri için çok yönlü bir arayüz sağlar.
API ve REST kavramları, bir uygulama için çok önemlidir. Bu kavramlar, web geliştiricileri için önemli bir araçtır ve sunucu ve kullanıcı arasındaki iletişimi sağlamak için kullanılır. Ayrıca, REST API, uygulama geliştiricilerinin daha hızlı bir şekilde uygulama geliştirmeyi ve daha etkili bir şekilde veri depolamayı sağlar.
Django Rest Framework Özellikleri
Django Rest Framework (DRF), RESTful API'lerin oluşturulması ve yönetimi için kullanılan açık kaynak kodlu bir yardımcı programdır. Django'nun güçlü yapısını kullanarak, RESTful API'lerin oluşturulmasını oldukça kolaylaştıran DRF, bir dizi özellik sunmaktadır. Bu özellikler ayrıntılı bir şekilde aşağıdaki gibidir:
Özellik | Açıklama |
---|---|
Serializer ve Model Serializers | DRF, Nesne ilişkilendirmesi ve Veritabanı modelleri arasındaki dönüşümün kolaylığı için Serializer ve ModelSerializer özelliklerini sunar. Serializer, JSON veya XML gibi veri biçimlerini Python nesnelerine dönüştürür ve tersi. Serializer sınıfı, ayrıca doğrulama, işlev ve veri manipülasyonu işlemlerini de gerçekleştirebilir. Model Serializer ise, Django model nesnelerini Serializer özelliklerinden türetir ve otomatik veri alanları ve doğrulama kuralları ekler. |
Views ve Viewsets | DRF, karşılık gelen HTTP isteklerine yanıt veren API görünümleri oluşturmanın kolaylığı için views ve viewsets özelliklerini sunar. View, HTTP istekleriyle ilişkili olan bir işlevi temsil ederken, viewset, bir dizi benzer HTTP isteğiyle ilişkili olan bir grup görünümü temsil eder. DRF, standart HTTP isteklerine yanıt vermek için iki farklı viewset sunar: ReadOnlyViewSet ve ModelViewSet. ReadOnlyViewSet yalnızca GET isteklerini destekler, ModelViewSet ise GET, POST, PUT gibi tüm CRUD işlemlerini destekler. |
Authentication ve Permissions | DRF, farklı kimlik doğrulama ve yetkilendirme yöntemlerine izin veren Authentication ve Permission özellikleri sunar. Authentication özelliği, kimlik doğrulama işlemini gerçekleştirirken, Permission özelliği, yalnızca yetkilendirilmiş kullanıcılara belirli API işlemlerinin erişimini sağlar. DRF, auth ve permission modülleriyle bir dizi önceden tanımlanmış kimlik doğrulama ve yetkilendirme yöntemleri sunar. Ayrıca, özel kimlik doğrulama ve yetkilendirme işlevleri de yazılabilir. |
DRF, RESTful API'lerin oluşturulması ve yönetimi için geliştirilmiş bir yardımcı programdır. Serializer ve ModelSerializers, Views ve Viewsets, Authentication ve Permissions gibi özellikleriyle Django ağırlıklı yapıda API oluşumunu kolaylaştırmaktadır.
Serializers ve ModelSerializers
Serializers ve ModelSerializers, Django Rest Framework'in en önemli özelliklerinden biridir. Serializers, Django model nesnelerini JSON, XML veya diğer içerik türleriyle dönüştürmenizi sağlar. Verileri kullanımı kolay bir formata dönüştürerek, API'leri kolaylıkla yönetmenize olanak tanır.
ModelSerializers ise, Serializer sınıfının alt sınıfıdır ve Django model nesneleriyle aynı mantığı kullanarak, verileri serileştirmeye yardımcı olur. ModelSerializers, Serializer'dan daha az kod yazarak Django model nesneleri için bir API oluşturmanıza olanak tanır.
Seriailzers ve ModelSerializers'ın kullanımı oldukça kolaydır. İlgili veri modelini "serializers.py" dosyasında tanımlamanız yeterlidir. Bu özellik sayesinde, Django Rest Framework, verileri dönüştürmek için otomatik SQL sorguları oluşturur. Örneğin, yalnızca birkaç satır kod yazarak, bir kullanıcının ismini, email adresini ve doğum tarihini dönen bir API oluşturabilirsiniz.
Aşağıdaki örnek serializers.py dosyası, Django User modeline ait verilerin dönüştürülmesini sağlar:
```from rest_framework import serializersfrom django.contrib.auth.models import User
class UserSerializer(serializers.ModelSerializer): class Meta: model = User fields = ('id', 'username', 'email', 'date_joined')```
Yukarıdaki örnekte, User modeli, User class'ından import edilir ve UserSerializer class'ı tanımlanır. Model sınıfı 'User' olarak belirlenir ve 'id', 'username', 'email', 'date_joined' alanları belirtilir.
Bir başka örnek olarak, aşağıdaki şekilde ModelSerializer tanımına örnek verilebilir.
```from rest_framework import serializersfrom .models import Product
class ProductSerializer(serializers.ModelSerializer): class Meta: model = Product fields = ('id', 'name', 'description', 'price')```
Yukarıdaki örnekte, Product modeli için bir API oluşturmak için ProductSerializer class'ı tanımlanır. Product modeli, from .models import Product ile içeri aktarılır ve 'id', 'name', 'description' ve 'price' alanları belirtilir.
Kısacası, Serializers ve ModelSerializers, Django'nun iyi bilinen model nesnesi ile en önemli Rest Framework özelliklerindendir. Django Rest Framework kullanıcılara, Django model nesnelerini serileştirmeye imkan vermektedir. Bu sayede verilerin API'ler ile yönetimi kolaylaşmaktadır.
Serializers
Serializer, Django Rest Framework'ün en önemli öğelerinden biridir. Serializer, bir Python objesinin JSON, XML veya diğer formatlara serileştirilmesini sağlar ve aynı zamanda bir HTTP isteğiyle gelen verileri bir Python objesine dönüştürür. Bu, Django Rest Framework ile bir REST API oluştururken çok önemlidir.
Bir Serializer sınıfı, işlem yapmak istediğiniz modelin yerine, verileri çıktıya dönüştürmenin ve girdi verilerini dosyalamanın bir yolunu sağlar. Ayrıca, yalnızca belli alanları serileştirmek ve sadece belirli alanlar için geçerli olacak doğrulamalar yapmak gibi özellikleri de vardır.
Serializer Özellikleri | Açıklaması |
---|---|
model | Giriş verilerinin doğrulanmasında kullanılacak veritabanı modeli. |
fields | Serializer'ın çıktısına dahil edilecek model alanları. |
exclude | Serializer'ın çıktısına dahil edilmeyecek model alanları. |
Bir Serializer sınıfı aşağıdaki gibi tanımlanabilir:
from rest_framework import serializersfrom .models import Userclass UserSerializer(serializers.Serializer): id = serializers.IntegerField(read_only=True) username = serializers.CharField(max_length=100) email = serializers.EmailField(max_length=100) password = serializers.CharField(write_only=True) def create(self, validated_data): return User.objects.create(**validated_data) def update(self, instance, validated_data): instance.username = validated_data.get('username', instance.username) instance.email = validated_data.get('email', instance.email) instance.password = validated_data.get('password', instance.password) instance.save() return instance
Bu örnek, "id", "username", "email" ve "password" alanlarına sahip bir kullanıcı modelini serileştirir. Aynı zamanda, "password" alanı yazılırken serileştirmeden çıkarılır ve veriye dahil edilmez.
Bir Serializer, iç içe geçme, çoklu obje serileştirme ve etkileşimli kullanıcı arabirimleri oluşturma gibi kaynakların yapılandırılmış bir şekilde temsil edilmesine izin verir. Ek olarak, isteğe bağlı olarak basit doğrulama kuraları da içerebilir. Bu sayede istemci tarafından gönderilen verilerin doğru bir şekilde işlenebileceği garanti edilebilir.
Django Rest Framework, hem Serializer hem de ModelSerializer'ı sunar. ModelSerializer, Serializer'ın sunduğu özelliklere ek olarak model sınıfı için varsayılan serileştirme, doğrulama ve güncelleme / yaratma yöntemlerini sağlar. Bu nedenle, ModelSerializer kullanımı, Serializer kullanımına göre daha hızlı ve güvenlidir.
ModelSerializers
ModelSerializers, Django Rest Framework'un en güçlü özelliklerinden biridir. Bu özellik, ORM modelimizin tüm alanlarını izleyerek onlara otomatik olarak bir Serializer sağlar. ModelSerializer, Serializer'a kıyasla daha az kod yazmamıza olanak tanır.
ModelSerializer oluşturmak oldukça basittir. Öncelikle, serializer'ımızın Meta sınıfında, hangi modelin serileştirileceğini belirtmemiz gerekiyor. Belirlediğimiz model için alanlar ve gereksinimler tanımlayabiliriz.
ModelSerializer, otomatik olarak modeldeki tüm alanları getirir ve onları serileştirir. Ayrıca, bir model üzerindeki yöntemleri ve FK'ları serileştirmenizi de sağlar.
Aşağıdaki örnekte, T-shirt modelimiz için bir ModelSerializer kullandık:
```pythonfrom rest_framework import serializersfrom .models import Tshirt
class TshirtSerializer(serializers.ModelSerializer): class Meta: model = Tshirt fields = '__all__'```
Yukarıdaki örnekte ModelSerializer'ımızı oluşturduk ve T-shirt modelimizi belirttik. `fields = '__all__'` tüm alanları serileştirir demektir. Ayrıca, `exclude` parametresiyle bazı alanları da hariç tutabiliriz.
ModelSerializer, serialization'ı ve deserialization'ı destekler. Bu sayede, modelimiz üzerindeki değişiklikleri yerleştirmeden önce onaylama kuralları ekleyebiliriz. Bu, web uygulamanızın güvenliğini artırır.
Views & Viewsets
Django Rest Framework kullanarak API'lerin görünümleri büyük ölçüde iki şekilde yapılabilir; Views ve Viewsets. Hem Views hem de Viewsets çok yönlü olmasına rağmen, her ikisinin de farklı özellikleri ve kullanım amaçları vardır.
Views, URL'leri karşılamanın başka bir yoludur. İstemci, belirli bir URL'ye istek gönderirse, web uygulamasında bazı eylemler gerçekleştirilir. İşleme, web uygulamasının backend modülünde yapılır. Burada, Views devreye girer. Views, URL'lere karşılık gelen response'ların oluşturulması, API'den gelen verilerin güncellenmesi gibi işlevleri yerine getirir. Django Rest Framework, request verilerini parçalamak ve response verilerini oluşturmaya olanak sağlayan birçok farklı View türü sağlar.
Viewsets, Django Rest Framework kullanarak RESTful API'lerin oluşturulması için en az kodlama gereksinimi olan yaklaşımdır. Viewset'inin amacı, belirli bir model için CRUD işlevlerinin (Create, Read, Update, Delete) kullanımını kolaylaştırmaktır. Viewset kullanmaya karar verirseniz, ihtiyacınız olan kod miktarını özellikle azaltacaksınız.
Genellikle, Viewsets ve Views birbirinin yerine kullanılabilir. İkisi de URL'leri karşılar ve kullanıcılara ilgili sonuçları getirir. Ancak, Viewsets, belirli bir modeli hızlı bir şekilde işlemek için tasarlanmıştırken, Views, bir URL için birden fazla cihazda yanıtlama yapmak için idealdir.
Bu nedenle, Views uygulamanın özel ihtiyaçları için, Viewsets ise CRUD işlevlerinin çok az kod yazarak kullanılması için idealdir. Django Rest Framework, her iki seçeneği de kullanmanıza olanak sağlar.
Views
Django Rest Framework kullanarak view'ler oluşturmak oldukça kolaydır. View'ler, Django'nun normal view'leri gibi çalışır ve HTTP isteklerine yanıt olarak bir HTTP cevabı döndürmek için kullanılır. DRF'de view'ler, APIView veya genişletilebilir Generic View'lardan birini kullanarak oluşturulabilir.
APIView, Base View sınıfının bir alt kümesidir. Bunu kullanarak özel senaryolarda farklı HTTP metodlarını işleyebilirsiniz. Örneğin, bir GET işleminin sonucunu veya bir POST işleminin başarılı olup olmadığını belirleyebilirsiniz.
Genişletilebilir Generic View'lar, APIView'ların yükseltilmiş sürümüdür. Bu, CRUD operasyonlarını birkaç satırda ve birkaç farklı model için oluşturmanızı sağlar. DRF, oluşturma, güncelleme, silme ve listeleme işlemlerini içeren genel görünümler sunar.
ViewSet, Django Rest Framework'te view'ler için daha yüksek bir işlevselliğe sahiptir. ViewSet, URL yönlendirmeyi kullanarak DisplayView, CreateView gibi fonksiyonel view'lerin kullanımını artırır. CRUD operasyonlarının varsayılan işlevlerini otomatik olarak ele alır ve belirli bir URL kalıbı üzerinde doğru mantığa sahip olacak şekilde düzenlenir.
ViewSet, işlevsel Spring REST Controller tarafından ilham alınmıştır. Django Rest Framework'de, URL yönlendirmeleri gibi konfigürasyonları kullanır. Bir ViewSet, modelinize göre otomatik olarak oluşturulabilir, ancak belirli select_related veya prefetch_related başvurularını da kullandırabilirsiniz.
Viewsets
Viewsets, Django Rest Framework tarafından sunulan bir başka önemli özelliktir. Viewset'ler, CRUD (Create, Read, Update, Delete) işlemlerini gerçekleştirebilen bir araçtır ve Django'nun genişletilmiş sınıflarından biridir. Bu nedenle, CRUD işlemlerinin tamamlanması sırasında sınıf tabanlı görünümlerden kaçınmak isteyen geliştiriciler için oldukça kullanışlıdır.
Viewset'ler REST mimarisi ile uyumludur ve tüm HTTP metotlarını destekler. Bu nedenle, GET, POST, PUT, PATCH ve DELETE taleplerine yönelik tüm gözetim işlemlerini kolay bir şekilde yönetmenizi sağlarlar. Ayrıca, bir Viewset içinde birden fazla görünüm gruplandırılabilir ve bu şekilde benzer kaynakları tek bir Viewset altında kategorize edebilirsiniz.
Örneğin, bir web uygulamasında bir blog modeli için Viewset kullanabilirsiniz. Bu sayede, bir API'ye istek göndererek tüm yazıları görüntüleyebilir, bir yazı ekleyebilir, bir yazıyı güncelleyebilir veya silinebilirsiniz. Ayrıca, tüm kaynakları tek bir yöntemde kategorize etmek yerine, birden çok Viewset kullanarak ayrıca yönetebilirsiniz.
Django Rest Framework, temel viewset'ler ile birlikte "ModelViewSet" sınıfını da sunar. Bu sınıf, varsayılan olarak tüm CRUD işlemlerini yapabilen bir Viewset sınıfıdır. Bu nedenle, ModelViewSet'i kullanmak, yazılım geliştirme sürecini önemli ölçüde hızlandırır.
Sonuç olarak, Viewset kullanarak Django Rest Framework projelerinizde kaynaklarınızı daha etkili bir şekilde üstlenmeniz mümkündür. CRUD işlemlerini daha az çabalayarak yönetebilir, benzer kaynakları tek bir yerde grublayabilir ve API'lerinizin de daha organik görünmesini sağlayabilirsiniz.
Authentication & Permissions
Django Rest Framework, API'lerin geliştirilmesi sırasında kullanıcının kimliğinin doğrulanması ve izinlerinin yönetimi için birçok farklı seçeneğe sahip olan Authentication ve Permissions kavramlarını destekler. Authentication, kullanıcının kimliğinin doğrulanmasına ve yetkilendirilmesine izin verirken, Permissions belirli işlemlerin yapılabilmesi için kullanıcılara tanınan yetkileri kontrol eder.
Django Rest Framework, genellikle kullanıcının kimliğini doğrulamanın çeşitli yol ve yöntemlerini sunan doğrulanma araçları bulundurur. Bu araçlar arasında Basit doğrulama, Token doğrulama, SessionAuthentication, BasicAuthentication ve JSON Web Token Authentication gibi farklı seçenekler bulunur.
Bu kavramların yanı sıra, Django Rest Framework aynı zamanda Authorization işlemleri için de olanaklar sunar. Django Rest Framework, kullanıcıların hangi işlemleri gerçekleştirebileceğini belirlemek için birçok farklı izin mekanizması sunar. Örneğin, Django Rest Framework bu işlemler için izinlerden yararlanır; SAFE_METHODS (GET, OPTIONS ve HEAD) ve diğer tüm yöntemler için ayrı izinler belirlenebilir.
Özetle, Django Rest Framework, API geliştiricilerine yetkilendirme işlemlerini basitleştiren kullanışlı araçlar sunar. Bu araçlar sayesinde kullanıcının kimliği doğrulanır ve isteklerin gerçekleştirilmesi için uygun izinlerle karşılaşılır.
Authentication
Authentication, bir kullanıcının kimlik doğrulama işleminin yapıldığı süreçtir. Yani, kullanıcının kimliğinin doğrulandığından emin olunarak bir kaynak ya da hizmete erişmesi sağlanır. Django Rest Framework, bu kimlik doğrulama işleminin tamamlanması için farklı authentication yöntemleri sunar.
TokenAuthentication, BasicAuthentication ve SessionAuthentication gibi farklı authentication yöntemleri vardır. TokenAuthentication kullanıldığında kullanıcılar, özel bir token'ı kullanarak kimlik doğrulama işlemi gerçekleştirirler. BasicAuthentication ise, kullanıcı adı ve şifre ile doğrulama yapar. SessionAuthentication, kullanıcının tarayıcıda oturum açtığı varsayılır ve kimlik doğrulama işlemi tarayıcı oturum bilgileri kullanılarak yapılır.
Bu authentication yöntemlerinden en uygun olanı proje gereksinimlerine ve kullanıcılara göre belirlenir. Django Rest Framework, kullanıcının doğru bir şekilde kimlik doğrulama yapmasını sağlamak için güçlü bir authentication altyapısı sunar.
Permissions
Permissions, Django Rest Framework'ün güvenlik önlemleri arasında en önemli olanıdır. Bu özellik, belirli bir kaynağa kimlerin erişebileceğini kontrol etmek için kullanılır. Örneğin, bir kullanıcının yalnızca kendi profil bilgilerini ve gönderilerini görüntüleyebilmesi veya yalnızca yöneticilerin belirli bir kaynağa erişebilmesi gibi.
Django Rest Framework'de varsayılan olarak, bir kullanıcının herhangi bir kaynağa erişimi bulunmaz. Bu nedenle, her kaynağın belirli bir izinlendirme düzeyine sahip olması gerekir. permission_classes kullanarak, bir kaynağa hangi izinlendirme düzeyine sahip kullanıcıların erişebileceğini belirtebilirsiniz.
Django Rest Framework'de birkaç farklı izin türü vardır. İlgili izin türünü permission_classes kullanarak belirtebilirsiniz. Örneğin IsAuthenticated, biristek gönderen kişinin kimlik doğrulamasını sağlar. 'IsAdminUser' ise sadece yöneticilere erişim sağlar.
İzin verilen tüm izinler için İzinler belgelerine göz atabilirsiniz. Bu belgeler özellikle API'deki kaynakların kullanımı için kapsamlı bir şekilde hazırlanmıştır. Eğer API larınız için bazı özel izinler oluşturmanız gerekiyorsa, Django Rest Framework size kolay bir şekilde özelleştirebilme seçeneği sunar.
Kısacası, Django Rest Framework'de Permission özelliği, uygulamanızın güvenliğini sağlamak için kullanabileceğiniz önemli bir araçtır. API'nizin belirli kaynaklara kimlerin erişebileceğini, kimlerin düzenleyebileceğini ve kimlerin yalnızca belirli kaynakların içeriğini görebileceğini belirlemede oldukça kullanışlıdır.