{"id":34261,"date":"2025-11-14T02:02:02","date_gmt":"2025-11-13T23:02:02","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/day-10-django-ileri-seviye-veritabani-ve-api-entegrasyonu\/"},"modified":"2025-11-14T02:02:02","modified_gmt":"2025-11-13T23:02:02","slug":"day-10-django-ileri-seviye-veritabani-ve-api-entegrasyonu","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/day-10-django-ileri-seviye-veritabani-ve-api-entegrasyonu\/","title":{"rendered":"Day 10 Django: \u0130leri Seviye Veritaban\u0131 ve API Entegrasyonu"},"content":{"rendered":"<p><body><\/p>\n<p>\n    Django \u00f6\u011frenim ser\u00fcveninizin 10. g\u00fcn\u00fcne ho\u015f geldiniz! Bu kritik a\u015famada, temel bilgilerinizi sa\u011flamla\u015ft\u0131rarak daha karma\u015f\u0131k veritaban\u0131 ili\u015fkilerini, g\u00fc\u00e7l\u00fc RESTful API&#8217;ler geli\u015ftirmeyi ve g\u00fcvenlik \u00f6nlemlerini nas\u0131l uygulayaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m ke\u015ffedece\u011fiz. Art\u0131k sadece web sayfalar\u0131 tasarlamakla kalmayacak, ayn\u0131 zamanda uygulamalar\u0131n\u0131z\u0131 veri odakl\u0131 ve etkile\u015fimli hale getireceksiniz.\n<\/p>\n<p>\n    Django yolculu\u011funuzda 10. g\u00fcne ula\u015fmak, basit CRUD (Olu\u015fturma, Okuma, G\u00fcncelleme, Silme) operasyonlar\u0131n\u0131n \u00f6tesine ge\u00e7meye haz\u0131r oldu\u011funuz anlam\u0131na gelir. \u0130lk g\u00fcnlerinizde modelleri, g\u00f6r\u00fcn\u00fcmleri ve \u015fablonlar\u0131 anlamakla me\u015fgulken, bu a\u015fama sizi ger\u00e7ek d\u00fcnya uygulamalar\u0131n\u0131n karma\u015f\u0131kl\u0131\u011f\u0131na haz\u0131rlar. Bir d\u00fc\u015f\u00fcn\u00fcn: bug\u00fcne kadar bir blog veya basit bir g\u00f6rev listesi uygulamas\u0131 yapm\u0131\u015f olabilirsiniz. Ancak b\u00fcy\u00fck \u00f6l\u00e7ekli bir e-ticaret sitesi, bir sosyal medya platformu veya bir bankac\u0131l\u0131k uygulamas\u0131 geli\u015ftirmek istedi\u011finizde, sadece temel yap\u0131lar yeterli gelmez. \u0130\u015fte tam da bu noktada, ileri seviye veritaban\u0131 y\u00f6netimi, d\u0131\u015f sistemlerle entegrasyon i\u00e7in API&#8217;ler, kullan\u0131c\u0131 kimlik do\u011frulama mekanizmalar\u0131 ve performans optimizasyonlar\u0131 devreye girer.\n<\/p>\n<p>\n    Bu a\u015fama, uygulaman\u0131z\u0131n sadece \u00e7al\u0131\u015fmas\u0131n\u0131 de\u011fil, ayn\u0131 zamanda g\u00fcvenli, \u00f6l\u00e7eklenebilir ve y\u00f6netilebilir olmas\u0131n\u0131 sa\u011flar. Veri tutarl\u0131l\u0131\u011f\u0131, kullan\u0131c\u0131 deneyimi ve arka u\u00e7 i\u015flemlerinin sorunsuz ak\u0131\u015f\u0131, 10. g\u00fcn konular\u0131n\u0131n merkezindedir. \u00d6rne\u011fin, bir kullan\u0131c\u0131n\u0131n birden fazla \u00fcr\u00fcn\u00fc sepetine ekleyebilmesi, sipari\u015f verebilmesi ve \u00f6deme yapabilmesi i\u00e7in karma\u015f\u0131k veritaban\u0131 ili\u015fkilerini do\u011fru bir \u015fekilde modellemeniz gerekir. Ayr\u0131ca, bu i\u015flemlerin mobil uygulamalar, JavaScript tabanl\u0131 \u00f6n u\u00e7lar veya di\u011fer harici servisler taraf\u0131ndan eri\u015filebilir olmas\u0131 gerekti\u011finde, sa\u011flam bir API altyap\u0131s\u0131na ihtiya\u00e7 duyars\u0131n\u0131z. Bu ba\u011flamda, bu a\u015famadaki \u00f6\u011frenimleriniz, sizi sadece bir Django geli\u015ftiricisinden, tam te\u015fekk\u00fcll\u00fc bir web uygulama mimar\u0131 olmaya do\u011fru bir ad\u0131m daha yakla\u015ft\u0131racakt\u0131r. Unutmay\u0131n, sa\u011flam temeller \u00fczerine in\u015fa edilen bir yap\u0131, uzun \u00f6m\u00fcrl\u00fc ve ba\u015far\u0131l\u0131 olacakt\u0131r. Bu nedenle, bug\u00fcnk\u00fc konulara odaklanarak, gelecekteki projeleriniz i\u00e7in kendinize b\u00fcy\u00fck bir avantaj sa\u011flayacaks\u0131n\u0131z.\n<\/p>\n<p>\n    Bu g\u00fcnk\u00fc konumuz, Django&#8217;nun sadece bir web \u00e7at\u0131s\u0131 olmaktan \u00f6te, tam te\u015fekk\u00fcll\u00fc bir uygulama geli\u015ftirme platformu olarak nas\u0131l kullan\u0131labilece\u011fini g\u00f6sterecek. \u0130\u00e7eriklerimiz, \u00f6zellikle yeni ba\u015flayanlar\u0131n kafas\u0131n\u0131 kar\u0131\u015ft\u0131rabilecek karma\u015f\u0131k konular\u0131 anla\u015f\u0131l\u0131r bir dille a\u00e7\u0131klayarak, sizi ad\u0131m ad\u0131m ileri seviye uygulamalar geli\u015ftirmeye y\u00f6nlendirecek. B\u00f6ylece, sadece teorik bilgiyi de\u011fil, ayn\u0131 zamanda pratik uygulama becerilerini de kazanm\u0131\u015f olacaks\u0131n\u0131z. Haz\u0131rsan\u0131z, Django&#8217;nun derinliklerine do\u011fru yelken a\u00e7al\u0131m!\n<\/p>\n<h2>Django&#8217;da Geli\u015fmi\u015f Model Kullan\u0131m\u0131 ve Veritaban\u0131 \u0130li\u015fkileri Nelerdir?<\/h2>\n<p>\n    Django&#8217;nun kalbi, ORM (Object-Relational Mapper) ile veritaban\u0131 etkile\u015fimlerinde yatar. 10. g\u00fcnde, temel <code>ForeignKey<\/code> kullan\u0131mlar\u0131n\u0131n \u00f6tesine ge\u00e7erek daha karma\u015f\u0131k veritaban\u0131 ili\u015fkilerini ve model \u00f6zelliklerini inceleyece\u011fiz. \u00d6zellikle, bir\u00e7ok-\u00e7ok (Many-to-Many) ve bire-bir (One-to-One) ili\u015fkiler, ger\u00e7ek d\u00fcnya uygulamalar\u0131nda s\u0131k\u00e7a kar\u015f\u0131m\u0131za \u00e7\u0131kar ve bu ili\u015fkileri do\u011fru bir \u015fekilde modellemek, veri tutarl\u0131l\u0131\u011f\u0131 ve sorgu verimlili\u011fi a\u00e7\u0131s\u0131ndan kritik \u00f6neme sahiptir. \u00d6rne\u011fin, bir e-ticaret uygulamas\u0131nda bir \u00fcr\u00fcn\u00fcn birden fazla kategoriye ait olabilmesi veya bir kullan\u0131c\u0131n\u0131n sadece tek bir profil bilgisine sahip olmas\u0131 gibi senaryolar\u0131 ele alal\u0131m.\n<\/p>\n<h3>Many-to-Many \u0130li\u015fkiler Nas\u0131l Kurulur?<\/h3>\n<p>\n    <code>ManyToManyField<\/code> iki model aras\u0131nda birden fazla kayd\u0131n birbirleriyle ili\u015fkili olabilece\u011fi durumlar i\u00e7in idealdir. \u00d6rne\u011fin, bir &#8220;Kitap&#8221; modelinin birden fazla &#8220;Yazar&#8221; modeline, bir &#8220;Yazar&#8221; modelinin de birden fazla &#8220;Kitap&#8221; modeline sahip olabilece\u011fi bir k\u00fct\u00fcphane sistemi d\u00fc\u015f\u00fcn\u00fcn. Bu ili\u015fkiyi kurmak i\u00e7in, <code>ManyToManyField<\/code> alan\u0131n\u0131 modellerden birine eklemeniz yeterlidir. Django, bu iki model aras\u0131ndaki ili\u015fkiyi y\u00f6netmek i\u00e7in otomatik olarak \u00fc\u00e7\u00fcnc\u00fc bir ara tablo (joining table) olu\u015fturur.\n<\/p>\n<pre><code class=\"language-python\">\n# models.py\nfrom django.db import models\n\nclass Yazar(models.Model):\n    ad = models.CharField(max_length=100)\n    soyad = models.CharField(max_length=100)\n\n    def __str__(self):\n        return f\"{self.ad} {self.soyad}\"\n\nclass Kitap(models.Model):\n    baslik = models.CharField(max_length=200)\n    yazarlar = models.ManyToManyField(Yazar, related_name='kitaplar') # related_name: tersten eri\u015fim i\u00e7in\n    yayin_tarihi = models.DateField()\n\n    def __str__(self):\n        return self.baslik\n<\/pre>\n<p><\/code><\/p>\n<p>\n    Yukar\u0131daki \u00f6rnekte, bir <code>Kitap<\/code> nesnesinden <code>kitap.yazarlar.all()<\/code> ile yazarlar\u0131na, bir <code>Yazar<\/code> nesnesinden ise <code>yazar.kitaplar.all()<\/code> ile kitaplar\u0131na eri\u015febilirsiniz. Bu esneklik, karma\u015f\u0131k veri yap\u0131lar\u0131n\u0131 y\u00f6netmek i\u00e7in \u00e7ok \u00f6nemlidir.\n<\/p>\n<h3>One-to-One \u0130li\u015fkiler ve Uzant\u0131lar<\/h3>\n<p>\n    <code>OneToOneField<\/code> bir modelin di\u011fer bir modelle birebir ili\u015fki kurmas\u0131n\u0131 sa\u011flar. Bu genellikle, <code>User<\/code> modeli gibi mevcut bir modele ek \u00f6zellikler eklemek istedi\u011finizde kullan\u0131l\u0131r. \u00d6rne\u011fin, her kullan\u0131c\u0131n\u0131n kendine \u00f6zel bir profil sayfas\u0131 olmas\u0131n\u0131 istiyorsan\u0131z, <code>User<\/code> modeline do\u011frudan alanlar eklemek yerine bir <code>UserProfile<\/code> modeli olu\u015fturup <code>User<\/code> ile <code>OneToOneField<\/code> \u00fczerinden ili\u015fkilendirmek daha iyi bir yakla\u015f\u0131md\u0131r.\n<\/p>\n<pre><code class=\"language-python\">\n# models.py\nfrom django.db import models\nfrom django.contrib.auth.models import User\n\nclass UserProfile(models.Model):\n    user = models.OneToOneField(User, on_delete=models.CASCADE)\n    dogum_tarihi = models.DateField(null=True, blank=True)\n    profil_resmi = models.ImageField(upload_to='profil_resimleri\/', null=True, blank=True)\n    biyografi = models.TextField(blank=True)\n\n    def __str__(self):\n        return self.user.username\n<\/pre>\n<p><\/code><\/p>\n<p>\n    Burada <code>on_delete=models.CASCADE<\/code> parametresi, ili\u015fkili <code>User<\/code> silindi\u011finde <code>UserProfile<\/code> nesnesinin de silinmesini sa\u011flar. Bu, veri tutarl\u0131l\u0131\u011f\u0131n\u0131 korumak i\u00e7in hayati bir detayd\u0131r. Ayr\u0131ca, <code>OneToOneField<\/code> kullanarak temel <code>User<\/code> modelini geni\u015fletmek, Django'nun kullan\u0131c\u0131 y\u00f6netimini bozmadan esneklik sa\u011flar.\n<\/p>\n<h3>Geli\u015fmi\u015f QuerySet Metotlar\u0131<\/h3>\n<p>\n    QuerySet'ler \u00fczerinde <code>annotate()<\/code>, <code>aggregate()<\/code> gibi metotlar\u0131 kullanarak veritaban\u0131 seviyesinde karma\u015f\u0131k sorgular \u00e7al\u0131\u015ft\u0131rabilirsiniz. <code>annotate()<\/code> her nesneye yeni bir alan eklerken, <code>aggregate()<\/code> bir QuerySet'in tamam\u0131 \u00fczerinde tek bir de\u011fer d\u00f6nd\u00fcr\u00fcr (\u00f6rne\u011fin toplam, ortalama).\n<\/p>\n<pre><code class=\"language-python\">\n# \u00d6rnek: Her yazar\u0131n ka\u00e7 kitab\u0131 oldu\u011funu bulma\nfrom django.db.models import Count\n\nyazarlar_kitap_sayisi = Yazar.objects.annotate(kitap_sayisi=Count('kitaplar'))\n\nfor yazar in yazarlar_kitap_sayisi:\n    print(f\"{yazar.ad} {yazar.soyad}: {yazar.kitap_sayisi} kitap\")\n\n# \u00d6rnek: Toplam kitap say\u0131s\u0131\ntoplam_kitap_sayisi = Kitap.objects.aggregate(toplam=Count('id'))['toplam']\nprint(f\"Veritaban\u0131ndaki toplam kitap say\u0131s\u0131: {toplam_kitap_sayisi}\")\n<\/pre>\n<p><\/code><\/p>\n<p>\n    Bu t\u00fcr geli\u015fmi\u015f sorgular, raporlama, istatistik \u00e7\u0131karma ve veri analizi gibi durumlarda olduk\u00e7a i\u015finize yarayacakt\u0131r. Model ili\u015fkilerini ve QuerySet'leri derinlemesine anlamak, performansl\u0131 ve g\u00fc\u00e7l\u00fc Django uygulamalar\u0131 geli\u015ftirmenin temelini olu\u015fturur.\n<\/p>\n<h2>RESTful API'ler ile Django Uygulamalar\u0131n\u0131z\u0131 Nas\u0131l Geni\u015fletirsiniz?<\/h2>\n<p>\n    Modern web uygulamalar\u0131, genellikle farkl\u0131 platformlardan (web taray\u0131c\u0131lar\u0131, mobil uygulamalar, masa\u00fcst\u00fc uygulamalar\u0131) eri\u015filebilen bir arka u\u00e7 servisi gerektirir. \u0130\u015fte bu noktada RESTful API'ler devreye girer. REST (Representational State Transfer) mimarisi, web servisleri olu\u015fturmak i\u00e7in kullan\u0131lan pop\u00fcler bir yakla\u015f\u0131md\u0131r. Django'yu g\u00fc\u00e7l\u00fc bir API sunucusuna d\u00f6n\u00fc\u015ft\u00fcrmenin en etkili yolu ise Django REST Framework (DRF) kullanmakt\u0131r. DRF, Django projelerinizde h\u0131zla API'ler geli\u015ftirmenizi sa\u011flayan esnek ve kapsaml\u0131 bir ara\u00e7 setidir. Bu b\u00f6l\u00fcmde, DRF ile nas\u0131l API olu\u015fturulaca\u011f\u0131n\u0131 ad\u0131m ad\u0131m \u00f6\u011frenece\u011fiz.\n<\/p>\n<h3>Django REST Framework (DRF) Kurulumu ve Temelleri<\/h3>\n<p>\n    DRF'yi projenize entegre etmek olduk\u00e7a basittir. \u0130lk olarak, DRF paketini kurman\u0131z gerekir:\n<\/p>\n<pre><code class=\"language-bash\">\npip install djangorestframework\n<\/pre>\n<p><\/code><\/p>\n<p>\n    Ard\u0131ndan, Django projenizin <code>settings.py<\/code> dosyas\u0131na <code>rest_framework<\/code> uygulamas\u0131n\u0131 ekleyin:\n<\/p>\n<pre><code class=\"language-python\">\n# settings.py\nINSTALLED_APPS = [\n    # ...\n    'rest_framework',\n    # ... sizin uygulamalar\u0131n\u0131z\n]\n<\/pre>\n<p><\/code><\/p>\n<h3>Serializers: Veriyi JSON'a D\u00f6n\u00fc\u015ft\u00fcrme<\/h3>\n<p>\n    DRF'nin temelini <code>Serializer<\/code>'lar olu\u015fturur. Serializer'lar, Django modellerini JSON (veya XML gibi di\u011fer formatlar) gibi d\u00f6n\u00fc\u015ft\u00fcr\u00fclebilir formatlara \u00e7evirmenin ve gelen veriyi model nesnelerine geri d\u00f6n\u00fc\u015ft\u00fcrmenin anahtar\u0131d\u0131r. <code>ModelSerializer<\/code> ise, belirli bir model i\u00e7in otomatik olarak alanlar\u0131 ve do\u011frulama kurallar\u0131n\u0131 olu\u015fturan pratik bir se\u00e7enektir.\n<\/p>\n<pre><code class=\"language-python\">\n# kutuphane\/serializers.py (varsayal\u0131m ki kutuphane ad\u0131nda bir uygulaman\u0131z var)\nfrom rest_framework import serializers\nfrom .models import Kitap, Yazar\n\nclass YazarSerializer(serializers.ModelSerializer):\n    class Meta:\n        model = Yazar\n        fields = ['id', 'ad', 'soyad']\n\nclass KitapSerializer(serializers.ModelSerializer):\n    yazarlar = YazarSerializer(many=True, read_only=True) # \u0130li\u015fkili modeli de g\u00f6ster\n\n    class Meta:\n        model = Kitap\n        fields = ['id', 'baslik', 'yazarlar', 'yayin_tarihi']\n<\/pre>\n<p><\/code><\/p>\n<p>\n    Burada, <code>KitapSerializer<\/code> i\u00e7inde <code>yazarlar<\/code> alan\u0131n\u0131 <code>YazarSerializer<\/code> kullanarak g\u00f6steriyoruz. <code>many=True<\/code> bir kitab\u0131n birden fazla yazar\u0131 olabilece\u011fini, <code>read_only=True<\/code> ise bu alan\u0131n sadece okunabilir oldu\u011funu (yani API \u00fczerinden yazar eklenip silinemeyece\u011fini, sadece Kitap'a atanan yazarlar\u0131 g\u00f6sterece\u011fini) belirtir.\n<\/p>\n<h3>ViewSets ve URL Y\u00f6nlendirmesi<\/h3>\n<p>\n    <code>ViewSets<\/code>, DRF'de CRUD operasyonlar\u0131n\u0131 (Liste, Olu\u015fturma, Getirme, G\u00fcncelleme, Silme) tek bir s\u0131n\u0131f alt\u0131nda gruplaman\u0131n g\u00fc\u00e7l\u00fc bir yoludur. Django'nun <code>urls.py<\/code> dosyas\u0131nda <code>Router<\/code> kullanarak ViewSet'leri otomatik olarak URL'lere ba\u011flayabiliriz.\n<\/p>\n<pre><code class=\"language-python\">\n# kutuphane\/views.py\nfrom rest_framework import viewsets\nfrom .serializers import KitapSerializer, YazarSerializer\nfrom .models import Kitap, Yazar\n\nclass KitapViewSet(viewsets.ModelViewSet):\n    queryset = Kitap.objects.all()\n    serializer_class = KitapSerializer\n\nclass YazarViewSet(viewsets.ModelViewSet):\n    queryset = Yazar.objects.all()\n    serializer_class = YazarSerializer\n\n# projenizin urls.py (\u00f6rn: myproject\/urls.py)\nfrom django.contrib import admin\nfrom django.urls import path, include\nfrom rest_framework.routers import DefaultRouter\nfrom kutuphane.views import KitapViewSet, YazarViewSet\n\nrouter = DefaultRouter()\nrouter.register(r'kitaplar', KitapViewSet)\nrouter.register(r'yazarlar', YazarViewSet)\n\nurlpatterns = [\n    path('admin\/', admin.site.urls),\n    path('api\/', include(router.urls)), # API endpoint'lerini buraya dahil ediyoruz\n]\n<\/pre>\n<p><\/code><\/p>\n<p>\n    Bu yap\u0131 sayesinde, <code>\/api\/kitaplar\/<\/code> adresine GET iste\u011fi g\u00f6nderdi\u011finizde t\u00fcm kitaplar\u0131n listesini, POST iste\u011fi g\u00f6nderdi\u011finizde yeni bir kitap olu\u015fturabilir, <code>\/api\/kitaplar\/{id}\/<\/code> adresine GET, PUT, DELETE istekleri g\u00f6ndererek belirli bir kitab\u0131 y\u00f6netebilirsiniz. DRF'nin sa\u011flad\u0131\u011f\u0131 otomatik API taray\u0131c\u0131s\u0131 aray\u00fcz\u00fc sayesinde, geli\u015ftirme s\u00fcrecinizde API'lerinizi kolayca test edebilirsiniz. Bu, API geli\u015ftirme s\u00fcrecini inan\u0131lmaz derecede h\u0131zland\u0131r\u0131r ve hatalar\u0131 ay\u0131klamay\u0131 basitle\u015ftirir.\n<\/p>\n<h3>API Kimlik Do\u011frulama ve \u0130zinler: G\u00fcvenli\u011fi Nas\u0131l Sa\u011flars\u0131n\u0131z?<\/h3>\n<p>\n    Her g\u00fc\u00e7l\u00fc API'nin ard\u0131nda sa\u011flam bir g\u00fcvenlik katman\u0131 olmal\u0131d\u0131r. Django REST Framework, API'lerinizi yetkisiz eri\u015fime kar\u015f\u0131 korumak i\u00e7in esnek kimlik do\u011frulama (Authentication) ve izin (Permission) mekanizmalar\u0131 sunar. Kimlik do\u011frulama, bir kullan\u0131c\u0131n\u0131n kim oldu\u011funu belirlerken, izinler ise bu kullan\u0131c\u0131n\u0131n belirli bir kayna\u011fa eri\u015fip eri\u015femeyece\u011fini veya belirli bir i\u015flemi yap\u0131p yapamayaca\u011f\u0131n\u0131 kontrol eder. Bu iki kavram\u0131 do\u011fru uygulamak, API g\u00fcvenli\u011finizin temelini olu\u015fturur.\n<\/p>\n<h4>Kimlik Do\u011frulama Y\u00f6ntemleri<\/h4>\n<p>\n    DRF \u00e7e\u015fitli kimlik do\u011frulama y\u00f6ntemlerini destekler. En yayg\u0131n kullan\u0131lanlar \u015funlard\u0131r:\n<\/p>\n<ul>\n<li>\n        <strong>SessionAuthentication:<\/strong> Django'nun oturum tabanl\u0131 kimlik do\u011frulama sistemini kullan\u0131r. Taray\u0131c\u0131 tabanl\u0131 istemciler i\u00e7in idealdir. Kullan\u0131c\u0131 giri\u015f yapt\u0131\u011f\u0131nda bir oturum \u00e7erezi olu\u015fturulur.\n    <\/li>\n<li>\n        <strong>TokenAuthentication:<\/strong> Her kullan\u0131c\u0131ya benzersiz bir belirte\u00e7 (token) atan\u0131r. \u0130stemci, her API iste\u011finde bu belirteci HTTP ba\u015fl\u0131\u011f\u0131na ekler. Mobil uygulamalar ve JavaScript tabanl\u0131 \u00f6n u\u00e7lar i\u00e7in \u00e7ok uygundur.\n    <\/li>\n<li>\n        <strong>JWT (JSON Web Token) Authentication:<\/strong> Daha modern ve pop\u00fcler bir y\u00f6ntemdir. Tokenlar \u015fifrelenir ve kullan\u0131c\u0131 bilgileri i\u00e7erebilir. Durumsuz (stateless) bir yap\u0131 sunar, bu da \u00f6l\u00e7eklenebilirlik a\u00e7\u0131s\u0131ndan avantajl\u0131d\u0131r.\n    <\/li>\n<\/ul>\n<p>\n    Bu makalede, kurulumu ve kullan\u0131m\u0131 nispeten daha basit olan <code>TokenAuthentication<\/code>'a odaklanaca\u011f\u0131z.\n<\/p>\n<h5>Token Kimlik Do\u011frulamay\u0131 Uygulama<\/h5>\n<p>\n    \u0130lk olarak, DRF'nin token uygulamas\u0131n\u0131 <code>INSTALLED_APPS<\/code>'a eklemeniz ve veritaban\u0131 migration'lar\u0131n\u0131 \u00e7al\u0131\u015ft\u0131rman\u0131z gerekir:\n<\/p>\n<pre><code class=\"language-python\">\n# settings.py\nINSTALLED_APPS = [\n    # ...\n    'rest_framework',\n    'rest_framework.authtoken', # Bu sat\u0131r\u0131 ekleyin\n    # ...\n]\n<\/pre>\n<p><\/code><\/p>\n<pre><code class=\"language-bash\"><\/pre>\n<p><\/code><br \/>\npython manage.py migrate<br \/>\n<\/code><\/p>\n<p>\n    Ard\u0131ndan, kullan\u0131c\u0131lara token atamak i\u00e7in bir yol sa\u011flamal\u0131s\u0131n\u0131z. Kullan\u0131c\u0131 olu\u015fturuldu\u011funda otomatik olarak token olu\u015fturmak veya \u00f6zel bir API ucu sa\u011flamak m\u00fcmk\u00fcnd\u00fcr.\n<\/p>\n<pre><code class=\"language-python\">\n# myproject\/urls.py (veya ilgili uygulaman\u0131z\u0131n urls.py'si)\nfrom rest_framework.authtoken.views import obtain_auth_token\n\nurlpatterns = [\n    # ... di\u011fer URL'ler\n    path('api\/token\/', obtain_auth_token, name='api_token_auth'), # Kullan\u0131c\u0131 ad\u0131 ve \u015fifre ile token al\u0131r\n]\n<\/pre>\n<p><\/code><\/p>\n<p>\n    \u015eimdi API'lerinize bu kimlik do\u011frulama y\u00f6ntemini uygulayabilirsiniz.\n<\/p>\n<pre><code class=\"language-python\">\n# k\u00fct\u00fcphane\/views.py (KitapViewSet \u00f6rne\u011fini geni\u015fletelim)\nfrom rest_framework.permissions import IsAuthenticated, IsAdminUser\nfrom rest_framework.authentication import TokenAuthentication\n\nclass KitapViewSet(viewsets.ModelViewSet):\n    queryset = Kitap.objects.all()\n    serializer_class = KitapSerializer\n    authentication_classes = [TokenAuthentication] # Token kimlik do\u011frulamas\u0131n\u0131 etkinle\u015ftir\n    permission_classes = [IsAuthenticated] # Sadece kimli\u011fi do\u011frulanm\u0131\u015f kullan\u0131c\u0131lar eri\u015febilir\n<\/pre>\n<p><\/code><\/p>\n<p>\n    Bu sayede, <code>KitapViewSet<\/code>'e eri\u015fmek isteyen her istemci, iste\u011fin HTTP ba\u015fl\u0131\u011f\u0131na bir token eklemek zorunda kal\u0131r: <code>Authorization: Token <token_de\u011feri><\/code>.\n<\/p>\n<h4>\u0130zin Mekanizmalar\u0131<\/h4>\n<p>\n    Kimlik do\u011frulama, kullan\u0131c\u0131n\u0131n kimli\u011fini kan\u0131tlar, ancak bir kayna\u011fa eri\u015fim yetkisini belirlemez. \u0130\u015fte burada izinler devreye girer. DRF, kullan\u0131ma haz\u0131r izin s\u0131n\u0131flar\u0131 sunar:\n<\/p>\n<ul>\n<li>\n        <strong>AllowAny:<\/strong> Herkese eri\u015fim izni verir (varsay\u0131lan).\n    <\/li>\n<li>\n        <strong>IsAuthenticated:<\/strong> Sadece kimli\u011fi do\u011frulanm\u0131\u015f kullan\u0131c\u0131lara izin verir.\n    <\/li>\n<li>\n        <strong>IsAdminUser:<\/strong> Sadece y\u00f6netici (admin) kullan\u0131c\u0131lar\u0131na izin verir.\n    <\/li>\n<li>\n        <strong>IsAuthenticatedOrReadOnly:<\/strong> Kimli\u011fi do\u011frulanm\u0131\u015f kullan\u0131c\u0131lara tam eri\u015fim, di\u011ferlerine sadece okuma izni verir.\n    <\/li>\n<\/ul>\n<p>\n    Kendi \u00f6zel izinlerinizi de olu\u015fturabilirsiniz. \u00d6rne\u011fin, sadece belirli bir grup \u00fcyesi olan veya bir nesnenin sahibi olan kullan\u0131c\u0131lara izin vermek isteyebilirsiniz.\n<\/p>\n<pre><code class=\"language-python\">\n# k\u00fct\u00fcphane\/permissions.py\nfrom rest_framework import permissions\n\nclass IsOwnerOrReadOnly(permissions.BasePermission):\n    \"\"\"\n    Sadece nesnenin sahibi olan kullan\u0131c\u0131lara d\u00fczenleme izni verir.\n    Di\u011fer kullan\u0131c\u0131lara okuma izni verir.\n    \"\"\"\n    def has_object_permission(self, request, view, obj):\n        # Okuma izinleri her zaman herkese verilir.\n        if request.method in permissions.SAFE_METHODS:\n            return True\n\n        # Yazma izinleri sadece nesnenin sahibi olan kullan\u0131c\u0131lara verilir.\n        return obj.owner == request.user # Varsayal\u0131m ki modelde bir 'owner' alan\u0131 var\n<\/pre>\n<p><\/code><\/p>\n<p>\n    Ard\u0131ndan, bu \u00f6zel izni ViewSet'inizde kullanabilirsiniz:\n<\/p>\n<pre><code class=\"language-python\">\n# k\u00fct\u00fcphane\/views.py\nfrom .permissions import IsOwnerOrReadOnly\n\nclass KitapViewSet(viewsets.ModelViewSet):\n    # ...\n    permission_classes = [IsAuthenticated, IsOwnerOrReadOnly] # Hem kimlik do\u011frulama hem de sahiplik kontrol\u00fc\n<\/pre>\n<p><\/code><\/p>\n<p>\n    Bu detayl\u0131 g\u00fcvenlik katmanlar\u0131, API'lerinizi g\u00fc\u00e7l\u00fc ve y\u00f6netilebilir k\u0131larken, kullan\u0131c\u0131 verilerinin ve sisteminizin korunmas\u0131n\u0131 sa\u011flar. Do\u011fru kimlik do\u011frulama ve izin politikalar\u0131 belirlemek, ba\u015far\u0131l\u0131 bir API stratejisinin ayr\u0131lmaz bir par\u00e7as\u0131d\u0131r.\n<\/p>\n<div class=\"expert-tip\">\n    Uzman \u0130pucu: Token tabanl\u0131 kimlik do\u011frulama kullan\u0131rken, tokenlar\u0131 g\u00fcvenli bir \u015fekilde saklad\u0131\u011f\u0131n\u0131zdan ve s\u00fcresi dolan tokenlar\u0131 yeniledi\u011finizden emin olun. Ayr\u0131ca, hassas API u\u00e7 noktalar\u0131 i\u00e7in JWT gibi daha geli\u015fmi\u015f ve \u00f6zellikli token y\u00f6ntemlerini de\u011ferlendirebilirsiniz. Bu, g\u00fcvenlik a\u00e7\u0131\u011f\u0131n\u0131 minimize etmenize yard\u0131mc\u0131 olacakt\u0131r.\n<\/div>\n<h2>Asenkron G\u00f6rev Y\u00f6netimi ve Arka Plan \u0130\u015flemleri Neden \u00d6nemli?<\/h2>\n<p>\n    Web uygulamalar\u0131, kullan\u0131c\u0131ya an\u0131nda geri bildirim vermesi beklenen interaktif aray\u00fczlerden ibaret de\u011fildir. Genellikle, e-posta g\u00f6nderimi, resim i\u015fleme, rapor olu\u015fturma, veri analizi veya \u00fc\u00e7\u00fcnc\u00fc taraf API'lerle entegrasyon gibi zaman al\u0131c\u0131 veya yo\u011fun i\u015flem gerektiren g\u00f6revlerle kar\u015f\u0131la\u015f\u0131r\u0131z. Bu t\u00fcr g\u00f6revleri do\u011frudan bir web iste\u011fi s\u0131ras\u0131nda i\u015flemek, kullan\u0131c\u0131n\u0131n iste\u011finin uzun s\u00fcre beklemesine, hatta zaman a\u015f\u0131m\u0131na u\u011framas\u0131na neden olabilir. \u0130\u015fte bu noktada asenkron g\u00f6rev y\u00f6netimi ve arka plan i\u015flemleri hayati \u00f6nem ta\u015f\u0131r. Bu, uygulaman\u0131z\u0131n performans\u0131n\u0131 ve kullan\u0131c\u0131 deneyimini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r.\n<\/p>\n<h3>Senkron ve Asenkron \u0130\u015flemler Aras\u0131ndaki Fark<\/h3>\n<ul>\n<li>\n        <strong>Senkron \u0130\u015flem:<\/strong> Bir g\u00f6rev tamamlanmadan di\u011ferine ge\u00e7ilemez. Bir web iste\u011fi geldi\u011finde, Django bu iste\u011fi i\u015flerken zaman alan bir operasyonla kar\u015f\u0131la\u015f\u0131rsa (\u00f6rne\u011fin 10 saniye s\u00fcren bir e-posta g\u00f6nderimi), kullan\u0131c\u0131 bu 10 saniye boyunca beklemek zorunda kal\u0131r ve aray\u00fcz kilitlenir.\n    <\/li>\n<li>\n        <strong>Asenkron \u0130\u015flem:<\/strong> Bir g\u00f6rev ba\u015flat\u0131ld\u0131ktan sonra, uygulama di\u011fer i\u015flemlere devam edebilir. Zaman alan g\u00f6rev ayr\u0131 bir s\u00fcre\u00e7te arka planda y\u00fcr\u00fct\u00fcl\u00fcr ve tamamland\u0131\u011f\u0131nda sonu\u00e7lar kaydedilebilir veya kullan\u0131c\u0131ya bildirim g\u00f6nderilebilir. Bu, kullan\u0131c\u0131 aray\u00fcz\u00fcn\u00fcn ak\u0131c\u0131 kalmas\u0131n\u0131 ve uygulaman\u0131n daha duyarl\u0131 olmas\u0131n\u0131 sa\u011flar.\n    <\/li>\n<\/ul>\n<h3>Celery ile Asenkron G\u00f6rev Y\u00f6netimi<\/h3>\n<p>\n    Django projelerinde asenkron g\u00f6revleri y\u00f6netmek i\u00e7in en pop\u00fcler ve g\u00fc\u00e7l\u00fc ara\u00e7lardan biri Celery'dir. Celery, da\u011f\u0131t\u0131lm\u0131\u015f g\u00f6rev kuyruklar\u0131 i\u00e7in bir sistemdir ve ger\u00e7ek zamanl\u0131 i\u015fleme ile d\u00fczenli aral\u0131klarla \u00e7al\u0131\u015fan g\u00f6revleri (cron i\u015fleri gibi) destekler. Celery'yi kullanabilmek i\u00e7in bir mesaj arac\u0131s\u0131na (broker) ihtiyac\u0131n\u0131z vard\u0131r; Redis veya RabbitMQ en yayg\u0131n tercihlerdir.\n<\/p>\n<h4>Celery Kurulumu ve Temel Kullan\u0131m<\/h4>\n<p>\n    \u0130lk ad\u0131m olarak Celery paketini kurun:\n<\/p>\n<pre><code class=\"language-bash\">\npip install celery redis # veya pip install celery rabbitmq\n<\/pre>\n<p><\/code><\/p>\n<p>\n    Ard\u0131ndan, Django projenizin k\u00f6k dizininde (<code>manage.py<\/code> ile ayn\u0131 seviyede) bir <code>celery.py<\/code> dosyas\u0131 olu\u015fturman\u0131z ve uygulaman\u0131z\u0131 yap\u0131land\u0131rman\u0131z gerekir:\n<\/p>\n<pre><code class=\"language-python\">\n# myproject\/celery.py\nimport os\nfrom celery import Celery\n\n# Django ayarlar\u0131n\u0131 Celery i\u00e7in yap\u0131land\u0131r\nos.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')\n\napp = Celery('myproject')\n\n# Uygulamalardaki g\u00f6revleri otomatik olarak ke\u015ffeder\napp.config_from_object('django.conf:settings', namespace='CELERY')\n\n# Y\u00fckl\u00fc t\u00fcm Django uygulamalar\u0131ndaki g\u00f6revleri otomatik olarak y\u00fckle\napp.autodiscover_tasks()\n\n@app.task(bind=True)\ndef debug_task(self):\n    print(f'Request: {self.request!r}')\n<\/pre>\n<p><\/code><\/p>\n<p>\n    <code>myproject\/settings.py<\/code> dosyan\u0131za broker URL'ini ekleyin:\n<\/p>\n<pre><code class=\"language-python\">\n# myproject\/settings.py\n# ...\nCELERY_BROKER_URL = 'redis:\/\/localhost:6379\/0' # Veya RabbitMQ i\u00e7in 'amqp:\/\/localhost'\nCELERY_RESULT_BACKEND = 'redis:\/\/localhost:6379\/0' # Sonu\u00e7lar\u0131 depolamak i\u00e7in\n# ...\n<\/pre>\n<p><\/code><\/p>\n<p>\n    Son olarak, Django projenizin <code>myproject\/__init__.py<\/code> dosyas\u0131na Celery uygulaman\u0131z\u0131 y\u00fckleyin:\n<\/p>\n<pre><code class=\"language-python\">\n# myproject\/__init__.py\nfrom .celery import app as celery_app\n\n__all__ = ('celery_app',)\n<\/pre>\n<p><\/code><\/p>\n<h4>G\u00f6rev Tan\u0131mlama ve \u00c7al\u0131\u015ft\u0131rma<\/h4>\n<p>\n    \u015eimdi bir Django uygulaman\u0131zda (\u00f6rne\u011fin <code>kutuphane\/tasks.py<\/code>) basit bir asenkron g\u00f6rev tan\u0131mlayal\u0131m:\n<\/p>\n<pre><code class=\"language-python\">\n# kutuphane\/tasks.py\nfrom celery import shared_task\nimport time\n\n@shared_task\ndef send_welcome_email(user_email):\n    \"\"\"\n    Yeni kay\u0131t olan kullan\u0131c\u0131ya ho\u015f geldiniz e-postas\u0131 g\u00f6nderir.\n    Zaman alan bir i\u015flem sim\u00fclasyonu.\n    \"\"\"\n    time.sleep(5) # 5 saniye bekleyerek e-posta g\u00f6nderimini sim\u00fcle et\n    print(f\"Ho\u015f geldiniz e-postas\u0131 {user_email} adresine g\u00f6nderildi.\")\n    return True\n<\/pre>\n<p><\/code><\/p>\n<p>\n    Bu g\u00f6revi bir Django g\u00f6r\u00fcn\u00fcm\u00fcnden veya model sinyalinden \u00e7a\u011f\u0131rabilirsiniz:\n<\/p>\n<pre><code class=\"language-python\">\n# kutuphane\/views.py\nfrom django.shortcuts import render\nfrom django.http import HttpResponse\nfrom .tasks import send_welcome_email\n\ndef register_user(request):\n    # ... kullan\u0131c\u0131 kay\u0131t i\u015flemleri ...\n    user_email = \"test@example.com\" # Kay\u0131t olan kullan\u0131c\u0131n\u0131n e-postas\u0131\n    send_welcome_email.delay(user_email) # G\u00f6revi arka plana g\u00f6nder\n    return HttpResponse(\"Kullan\u0131c\u0131 kayd\u0131 ba\u015far\u0131yla tamamland\u0131, e-posta g\u00f6nderiliyor...\")\n<\/pre>\n<p><\/code><\/p>\n<p>\n    <code>.delay()<\/code> metodu, g\u00f6revi Celery kuyru\u011funa g\u00f6nderir ve i\u015fleyici (worker) m\u00fcsait oldu\u011funda bu g\u00f6revi arka planda i\u015fler. Bu esnada, web sunucusu hemen bir yan\u0131t d\u00f6nd\u00fcrerek kullan\u0131c\u0131n\u0131n beklemesini engeller.\n<\/p>\n<p>\n    Celery i\u015fleyiciyi ve mesaj arac\u0131s\u0131n\u0131 \u00e7al\u0131\u015ft\u0131rmak i\u00e7in terminalde \u015fu komutlar\u0131 kullanman\u0131z gerekir (ayr\u0131 terminallerde):\n<\/p>\n<pre><code class=\"language-bash\">\n# Redis sunucusunu ba\u015flat\u0131n (e\u011fer kullan\u0131yorsan\u0131z)\nredis-server\n\n# Celery i\u015fleyiciyi ba\u015flat\u0131n (proje dizininizde)\ncelery -A myproject worker -l info\n<\/pre>\n<p><\/code><\/p>\n<p>\n    Asenkron g\u00f6revler, \u00f6zellikle y\u00fcksek trafikli uygulamalar ve karma\u015f\u0131k i\u015f mant\u0131\u011f\u0131na sahip sistemler i\u00e7in vazge\u00e7ilmezdir. Uygulaman\u0131z\u0131n daha h\u0131zl\u0131, daha duyarl\u0131 ve daha \u00f6l\u00e7eklenebilir olmas\u0131n\u0131 sa\u011flayarak hem kullan\u0131c\u0131 deneyimini hem de sistem performans\u0131n\u0131 iyile\u015ftirir.\n<\/p>\n<h2>Vaka Analizi: Bir E-Ticaret Sepeti ve \u00d6deme Sistemi Nas\u0131l Tasarlan\u0131r?<\/h2>\n<p>\n    \u015eimdiye kadar \u00f6\u011frendiklerimizi birle\u015ftirerek, ger\u00e7ek d\u00fcnya senaryolar\u0131ndan birini, yani temel bir e-ticaret sepeti ve \u00f6deme sistemi tasar\u0131m\u0131n\u0131 inceleyelim. Bu vaka analizi, Django modellerinin, ili\u015fkilerinin, DRF API'lerinin ve arka plan g\u00f6revlerinin nas\u0131l bir araya gelerek i\u015flevsel bir sistem olu\u015fturdu\u011funu g\u00f6sterecek.\n<\/p>\n<h3>Modeller ve \u0130li\u015fkiler<\/h3>\n<p>\n    Bir e-ticaret sisteminde olmazsa olmaz baz\u0131 modeller ve bu modeller aras\u0131ndaki ili\u015fkiler \u015funlard\u0131r:\n<\/p>\n<ul>\n<li>\n        <strong>\u00dcr\u00fcn (Product):<\/strong> <code>name<\/code>, <code>description<\/code>, <code>price<\/code>, <code>stock<\/code>.\n    <\/li>\n<li>\n        <strong>Kategori (Category):<\/strong> <code>name<\/code>, <code>description<\/code>. (<code>Product<\/code> ile <code>Many-to-Many<\/code> ili\u015fki, bir \u00fcr\u00fcn birden fazla kategoriye ait olabilir.)\n    <\/li>\n<li>\n        <strong>Sepet (Cart):<\/strong> Her kullan\u0131c\u0131n\u0131n bir sepeti olmal\u0131. (<code>User<\/code> ile <code>One-to-One<\/code> ili\u015fki). <code>created_at<\/code>, <code>updated_at<\/code>.\n    <\/li>\n<li>\n        <strong>Sepet \u00d6\u011fesi (CartItem):<\/strong> Sepetteki her \u00fcr\u00fcn bir <code>CartItem<\/code> olarak temsil edilir. <code>cart<\/code> (<code>ForeignKey<\/code> to <code>Cart<\/code>), <code>product<\/code> (<code>ForeignKey<\/code> to <code>Product<\/code>), <code>quantity<\/code>.\n    <\/li>\n<li>\n        <strong>Sipari\u015f (Order):<\/strong> Kullan\u0131c\u0131 sepetini onaylad\u0131\u011f\u0131nda olu\u015fur. <code>user<\/code> (<code>ForeignKey<\/code> to <code>User<\/code>), <code>total_price<\/code>, <code>status<\/code> (pending, completed, cancelled), <code>created_at<\/code>.\n    <\/li>\n<li>\n        <strong>Sipari\u015f \u00d6\u011fesi (OrderItem):<\/strong> Sipari\u015f i\u00e7indeki her \u00fcr\u00fcn. <code>order<\/code> (<code>ForeignKey<\/code> to <code>Order<\/code>), <code>product<\/code> (<code>ForeignKey<\/code> to <code>Product<\/code>), <code>quantity<\/code>, <code>unit_price<\/code>.\n    <\/li>\n<\/ul>\n<p>\n    Bu modeller ve ili\u015fkiler, sistemin veritaban\u0131 yap\u0131s\u0131n\u0131 olu\u015fturur. \u00d6zellikle <code>CartItem<\/code> ve <code>OrderItem<\/code> modelleri, bir <code>Many-to-Many<\/code> ili\u015fkiye ek \u00f6zellikler (adet, birim fiyat) eklemek i\u00e7in bir ara model (through model) g\u00f6revi g\u00f6r\u00fcr.\n<\/p>\n<pre><code class=\"language-python\">\n# e_commerce\/models.py\nfrom django.db import models\nfrom django.contrib.auth.models import User\n\nclass Category(models.Model):\n    name = models.CharField(max_length=100)\n    description = models.TextField(blank=True)\n\n    def __str__(self):\n        return self.name\n\nclass Product(models.Model):\n    name = models.CharField(max_length=200)\n    description = models.TextField()\n    price = models.DecimalField(max_digits=10, decimal_places=2)\n    stock = models.IntegerField(default=0)\n    categories = models.ManyToManyField(Category, related_name='products')\n\n    def __str__(self):\n        return self.name\n\nclass Cart(models.Model):\n    user = models.OneToOneField(User, on_delete=models.CASCADE)\n    created_at = models.DateTimeField(auto_now_add=True)\n    updated_at = models.DateTimeField(auto_now=True)\n\n    def __str__(self):\n        return f\"{self.user.username}'s Cart\"\n\nclass CartItem(models.Model):\n    cart = models.ForeignKey(Cart, on_delete=models.CASCADE, related_name='items')\n    product = models.ForeignKey(Product, on_delete=models.CASCADE)\n    quantity = models.PositiveIntegerField(default=1)\n\n    class Meta:\n        unique_together = ('cart', 'product') # Bir sepette ayn\u0131 \u00fcr\u00fcnden sadece bir tane olabilir (adet g\u00fcncellenir)\n\n    def __str__(self):\n        return f\"{self.quantity} x {self.product.name} in {self.cart.user.username}'s Cart\"\n\nclass Order(models.Model):\n    user = models.ForeignKey(User, on_delete=models.CASCADE)\n    total_price = models.DecimalField(max_digits=10, decimal_places=2, default=0.00)\n    status = models.CharField(max_length=20, default='pending') # completed, cancelled\n    created_at = models.DateTimeField(auto_now_add=True)\n    updated_at = models.DateTimeField(auto_now=True)\n\n    def __str__(self):\n        return f\"Order {self.id} by {self.user.username}\"\n\nclass OrderItem(models.Model):\n    order = models.ForeignKey(Order, on_delete=models.CASCADE, related_name='items')\n    product = models.ForeignKey(Product, on_delete=models.CASCADE)\n    quantity = models.PositiveIntegerField()\n    unit_price = models.DecimalField(max_digits=10, decimal_places=2)\n\n    def __str__(self):\n        return f\"{self.quantity} x {self.product.name} in Order {self.order.id}\"\n<\/pre>\n<p><\/code><\/p>\n<h3>API Entegrasyonu (DRF)<\/h3>\n<p>\n    Bu modellere dayanarak DRF ile API'ler olu\u015fturabiliriz.\n<\/p>\n<ul>\n<li>\n        <strong>\u00dcr\u00fcn API'si:<\/strong> T\u00fcm \u00fcr\u00fcnleri listeleme, belirli bir \u00fcr\u00fcn\u00fc detayland\u0131rma.\n    <\/li>\n<li>\n        <strong>Sepet API'si:<\/strong> Kullan\u0131c\u0131n\u0131n sepetini g\u00f6rme, sepete \u00fcr\u00fcn ekleme\/\u00e7\u0131karma, \u00fcr\u00fcn adetini g\u00fcncelleme. Bu API'ler <code>IsAuthenticated<\/code> iznine sahip olmal\u0131 ve sadece kullan\u0131c\u0131n\u0131n kendi sepeti \u00fczerinde i\u015flem yapmas\u0131na izin vermelidir.\n    <\/li>\n<li>\n        <strong>Sipari\u015f API'si:<\/strong> Yeni sipari\u015f olu\u015fturma (sepeti sipari\u015fe d\u00f6n\u00fc\u015ft\u00fcrme), kullan\u0131c\u0131n\u0131n ge\u00e7mi\u015f sipari\u015flerini g\u00f6rme. Sipari\u015f olu\u015fturma i\u015flemi, veritaban\u0131 i\u015flemlerini (stok g\u00fcncelleme, sipari\u015f \u00f6\u011feleri olu\u015fturma) kapsayaca\u011f\u0131 i\u00e7in bir i\u015flem (transaction) i\u00e7inde yap\u0131lmal\u0131d\u0131r.\n    <\/li>\n<\/ul>\n<pre><code class=\"language-python\">\n# e_commerce\/serializers.py\nfrom rest_framework import serializers\nfrom .models import Product, Category, Cart, CartItem, Order, OrderItem\nfrom django.contrib.auth.models import User\n\nclass ProductSerializer(serializers.ModelSerializer):\n    class Meta:\n        model = Product\n        fields = '__all__'\n\nclass CartItemSerializer(serializers.ModelSerializer):\n    product = ProductSerializer(read_only=True) # \u00dcr\u00fcn detaylar\u0131n\u0131 da g\u00f6ster\n\n    class Meta:\n        model = CartItem\n        fields = ['id', 'product', 'quantity']\n\nclass CartSerializer(serializers.ModelSerializer):\n    items = CartItemSerializer(many=True, read_only=True)\n    # Sepet toplam fiyat\u0131n\u0131 dinamik olarak hesaplayabiliriz\n    total_price = serializers.SerializerMethodField()\n\n    class Meta:\n        model = Cart\n        fields = ['id', 'user', 'items', 'total_price', 'created_at', 'updated_at']\n        read_only_fields = ['user']\n\n    def get_total_price(self, obj):\n        return sum(item.product.price * item.quantity for item in obj.items.all())\n\n# e_commerce\/views.py (\u00d6rnek bir sepet g\u00f6r\u00fcn\u00fcm\u00fc)\nfrom rest_framework import viewsets, status\nfrom rest_framework.response import Response\nfrom rest_framework.decorators import action\nfrom rest_framework.permissions import IsAuthenticated\nfrom .models import Cart, CartItem, Product\nfrom .serializers import CartSerializer, CartItemSerializer\n\nclass CartViewSet(viewsets.ModelViewSet):\n    serializer_class = CartSerializer\n    permission_classes = [IsAuthenticated]\n\n    def get_queryset(self):\n        # Sadece mevcut kullan\u0131c\u0131n\u0131n sepetini d\u00f6nd\u00fcr\n        return Cart.objects.filter(user=self.request.user)\n\n    def perform_create(self, serializer):\n        # Yeni sepet olu\u015fturuldu\u011funda kullan\u0131c\u0131y\u0131 atay\u0131n\n        serializer.save(user=self.request.user)\n\n    @action(detail=False, methods=['post'], url_path='add-item')\n    def add_item(self, request):\n        product_id = request.data.get('product_id')\n        quantity = request.data.get('quantity', 1)\n        \n        try:\n            product = Product.objects.get(id=product_id)\n            cart, created = Cart.objects.get_or_create(user=request.user) # Kullan\u0131c\u0131n\u0131n sepeti yoksa olu\u015ftur\n            cart_item, item_created = CartItem.objects.get_or_create(cart=cart, product=product,\n                                                                      defaults={'quantity': quantity})\n            if not item_created:\n                cart_item.quantity += int(quantity)\n                cart_item.save()\n            return Response(CartSerializer(cart).data, status=status.HTTP_200_OK)\n        except Product.DoesNotExist:\n            return Response({'error': '\u00dcr\u00fcn bulunamad\u0131.'}, status=status.HTTP_404_NOT_FOUND)\n        except Exception as e:\n            return Response({'error': str(e)}, status=status.HTTP_400_BAD_REQUEST)\n\n    # Benzer \u015fekilde 'remove-item', 'update-item-quantity' gibi action'lar eklenebilir.\n<\/pre>\n<p><\/code><\/p>\n<h3>Arka Plan \u0130\u015flemleri (Celery)<\/h3>\n<p>\n    \u00d6deme tamamland\u0131ktan sonra, kullan\u0131c\u0131ya bir sipari\u015f onay\u0131 e-postas\u0131 g\u00f6ndermek veya envanterde de\u011fi\u015fiklik yapmak gibi i\u015flemler arka planda Celery ile y\u00fcr\u00fct\u00fclebilir. Bu, \u00f6deme s\u00fcrecinin h\u0131zl\u0131 kalmas\u0131n\u0131 sa\u011flar.\n<\/p>\n<pre><code class=\"language-python\">\n# e_commerce\/tasks.py\nfrom celery import shared_task\nimport time\n\n@shared_task\ndef send_order_confirmation_email(order_id, user_email):\n    # Sipari\u015f detaylar\u0131n\u0131 al\n    # order = Order.objects.get(id=order_id)\n    time.sleep(10) # E-posta g\u00f6nderimini sim\u00fcle et\n    print(f\"Sipari\u015f {order_id} i\u00e7in onay e-postas\u0131 {user_email} adresine g\u00f6nderildi.\")\n\n@shared_task\ndef update_product_stock(product_id, quantity_ordered):\n    # \u00dcr\u00fcn stoklar\u0131n\u0131 g\u00fcncelle\n    # product = Product.objects.get(id=product_id)\n    # product.stock -= quantity_ordered\n    # product.save()\n    print(f\"\u00dcr\u00fcn {product_id} i\u00e7in stok g\u00fcncellendi. {quantity_ordered} adet d\u00fc\u015f\u00fcld\u00fc.\")\n<\/pre>\n<p><\/code><\/p>\n<p>\n    Bu vaka analizi, \"Day 10 Django Learning\" kapsam\u0131nda ele ald\u0131\u011f\u0131m\u0131z bir\u00e7ok konunun (geli\u015fmi\u015f modeller, DRF, kimlik do\u011frulama, arka plan g\u00f6revleri) ger\u00e7ek bir projede nas\u0131l bir araya getirilebilece\u011fini g\u00f6stermektedir. Bu \u015fekilde bir sistem tasarlamak, sadece fonksiyonel olmakla kalmaz, ayn\u0131 zamanda \u00f6l\u00e7eklenebilir, bak\u0131m\u0131 kolay ve performansl\u0131 bir uygulama olu\u015fturman\u0131z\u0131 sa\u011flar.\n<\/p>\n<h3>Django \u015eablonlar\u0131 i\u00e7in Mobil Uyumluluk: Media Query \u00d6rnekleri<\/h3>\n<p>\n    Django temel olarak bir arka u\u00e7 \u00e7at\u0131s\u0131 olsa da, olu\u015fturdu\u011funuz web sitelerinin kullan\u0131c\u0131lar taraf\u0131ndan farkl\u0131 cihazlarda d\u00fczg\u00fcn g\u00f6r\u00fcnt\u00fclenmesi kritik \u00f6neme sahiptir. Bu, \u00f6zellikle modern web geli\u015ftirme d\u00fcnyas\u0131nda mobil cihazlar\u0131n yayg\u0131nla\u015fmas\u0131yla daha da belirgin hale gelmi\u015ftir. Django'nun kendisi do\u011frudan mobil uyumluluk sa\u011flamaz, ancak statik dosyalar\u0131 (CSS, JavaScript, resimler) y\u00f6netme \u015fekli, duyarl\u0131 (responsive) tasar\u0131mlar\u0131 kolayca uygulaman\u0131za olanak tan\u0131r. Django \u015fablonlar\u0131n\u0131 kullanarak HTML \u00e7\u0131kt\u0131s\u0131 \u00fcretirken, bu HTML \u00e7\u0131kt\u0131s\u0131na ba\u011fl\u0131 CSS dosyalar\u0131n\u0131z arac\u0131l\u0131\u011f\u0131yla mobil uyumlulu\u011fu sa\u011flayabiliriz.\n<\/p>\n<h4>Statik Dosyalar\u0131n Y\u00f6netimi ve Media Queries<\/h4>\n<p>\n    Django projelerinde CSS dosyalar\u0131n\u0131z\u0131 genellikle bir uygulaman\u0131n <code>static\/css<\/code> dizininde veya projenin ana <code>static<\/code> dizininde bar\u0131nd\u0131r\u0131rs\u0131n\u0131z. \u015eablonlar\u0131n\u0131zda bu dosyalara <code>{% load static %}<\/code> ve <code>{% static &#039;css\/style.css&#039; %}<\/code> etiketleriyle eri\u015firsiniz. Mobil uyumluluk i\u00e7in, CSS dosyalar\u0131n\u0131zda \"media queries\" kullanman\u0131z gerekir. Media queries, ekran boyutuna, cihaza ve di\u011fer \u00f6zelliklere ba\u011fl\u0131 olarak farkl\u0131 stil kurallar\u0131 uygulaman\u0131za olanak tan\u0131yan CSS3 \u00f6zellikleridir.\n<\/p>\n<h5>Temel Media Query \u00d6rne\u011fi<\/h5>\n<p>\n    Diyelim ki, masa\u00fcst\u00fc g\u00f6r\u00fcn\u00fcm\u00fcnde \u00fc\u00e7 s\u00fctunlu bir d\u00fczeniniz var, ancak mobil cihazlarda bu s\u00fctunlar\u0131n dikey olarak s\u0131ralanmas\u0131n\u0131 istiyorsunuz.\n<\/p>\n<pre><code class=\"language-html\">\n<!-- myapp\/templates\/myapp\/base.html veya ilgili \u015fablon -->\n{% load static %}\n<!DOCTYPE html>\n<html lang=\"tr\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>{% block title %}Django Uygulamas\u0131{% endblock %}<\/title>\n    <link rel=\"stylesheet\" href=\"{% static 'css\/style.css' %}\">\n<\/head>\n<body>\n    <div class=\"container\">\n        <div class=\"column\">\u0130\u00e7erik 1<\/div>\n        <div class=\"column\">\u0130\u00e7erik 2<\/div>\n        <div class=\"column\">\u0130\u00e7erik 3<\/div>\n    <\/div>\n<\/body>\n<\/html>\n<\/pre>\n<p><\/code><\/p>\n<p>\n    \u015eimdi, <code>myapp\/static\/css\/style.css<\/code> dosyan\u0131za a\u015fa\u011f\u0131daki CSS kodunu ekleyelim:\n<\/p>\n<pre><code class=\"language-css\">\n\/* Genel stil kurallar\u0131 (Mobil \u00f6ncelikli yakla\u015f\u0131m) *\/\n.container {\n    display: flex;\n    flex-direction: column; \/* Mobil cihazlarda s\u00fctunlar alt alta *\/\n    padding: 10px;\n}\n\n.column {\n    flex: 1; \/* Mobil cihazlarda tam geni\u015flik *\/\n    margin-bottom: 10px;\n    background-color: #f0f0f0;\n    padding: 15px;\n    border-radius: 5px;\n}\n\n\/* Masa\u00fcst\u00fc cihazlar i\u00e7in media query *\/\n@media screen and (min-width: 768px) {\n    .container {\n        flex-direction: row; \/* Masa\u00fcst\u00fcnde yan yana s\u00fctunlar *\/\n        justify-content: space-around;\n    }\n    .column {\n        flex: 1; \/* E\u015fit geni\u015flikte da\u011f\u0131l\u0131m *\/\n        margin-right: 10px; \/* S\u00fctunlar aras\u0131na bo\u015fluk *\/\n        margin-bottom: 0; \/* Alttaki bo\u015flu\u011fu kald\u0131r *\/\n    }\n    .column:last-child {\n        margin-right: 0;\n    }\n}\n\/* Ekstra geni\u015f ekranlar i\u00e7in ba\u015fka bir \u00f6rnek *\/\n@media screen and (min-width: 1200px) {\n    .container {\n        max-width: 1140px; \/* Daha b\u00fcy\u00fck ekranlarda konteyneri sabitle *\/\n        margin: 0 auto; \/* Ortala *\/\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<p>\n    Yukar\u0131daki \u00f6rnekte, varsay\u0131lan olarak mobil cihazlar i\u00e7in tasarlanm\u0131\u015f bir d\u00fczen (<code>flex-direction: column<\/code>) tan\u0131mlad\u0131k. Daha sonra <code>min-width: 768px<\/code> olan ekranlar (genellikle tabletler ve masa\u00fcst\u00fc bilgisayarlar) i\u00e7in <code>flex-direction: row<\/code> kullanarak s\u00fctunlar\u0131 yatay hale getirdik. Bu \"mobil \u00f6ncelikli\" (mobile-first) yakla\u015f\u0131md\u0131r ve modern web geli\u015ftirmenin en iyi uygulamalar\u0131ndan biridir.\n<\/p>\n<p>\n    Django, bu statik dosyalar\u0131 sunmak i\u00e7in <code>STATIC_URL<\/code> ve <code>STATICFILES_DIRS<\/code> gibi ayarlar\u0131 kullan\u0131r. Geli\u015ftirme ortam\u0131nda <code>python manage.py runserver<\/code> otomatik olarak bu dosyalar\u0131 sunar. \u00dcretim ortam\u0131nda ise <code>python manage.py collectstatic<\/code> komutuyla t\u00fcm statik dosyalar\u0131n\u0131z\u0131 tek bir dizinde toplar ve genellikle Nginx veya Apache gibi bir web sunucusu arac\u0131l\u0131\u011f\u0131yla servis edersiniz.\n<\/p>\n<p>\n    Mobil uyumluluk sadece d\u00fczenle s\u0131n\u0131rl\u0131 de\u011fildir. Resimlerin optimize edilmesi (<code>srcset<\/code> \u00f6zniteli\u011fi, <code>picture<\/code> etiketi), dokunmatik odakl\u0131 aray\u00fcz elemanlar\u0131 ve JavaScript ile dinamik olarak i\u00e7eri\u011fin y\u00fcklenmesi gibi konular da bu kapsamda de\u011ferlendirilmelidir. Django'nun \u015fablon sistemi bu t\u00fcr frontend geli\u015ftirmelerini do\u011frudan desteklemezken, HTML \u00e7\u0131kt\u0131n\u0131z \u00fczerinde tam kontrol sa\u011flayarak ve statik dosya y\u00f6netimini kolayla\u015ft\u0131rarak bu entegrasyonu m\u00fcmk\u00fcn k\u0131lar. Bu da demek oluyor ki, Django ile geli\u015ftirme yaparken sadece arka ucu de\u011fil, ayn\u0131 zamanda kullan\u0131c\u0131lar\u0131n projenizle etkile\u015fim kuraca\u011f\u0131 \u00f6n y\u00fcz deneyimini de g\u00f6z \u00f6n\u00fcnde bulundurmal\u0131s\u0131n\u0131z.\n<\/p>\n<h2>Django'da 10. G\u00fcn\u00fc Ba\u015far\u0131yla Tamamlaman\u0131n Ard\u0131ndan<\/h2>\n<p>\n    Django \u00f6\u011frenim ser\u00fcveninizin 10. g\u00fcn\u00fcn\u00fc ba\u015far\u0131yla tamamlad\u0131n\u0131z ve bu, temel bir web geli\u015ftiricisinden daha karma\u015f\u0131k, g\u00fcvenli ve \u00f6l\u00e7eklenebilir uygulamalar tasarlayabilen bir mimara do\u011fru att\u0131\u011f\u0131n\u0131z \u00f6nemli bir ad\u0131md\u0131r. Bu g\u00fcnde, sadece teknik konulara de\u011fil, ayn\u0131 zamanda ger\u00e7ek d\u00fcnya uygulamalar\u0131n\u0131n nas\u0131l yap\u0131land\u0131r\u0131ld\u0131\u011f\u0131na dair derinlemesine bir bak\u0131\u015f a\u00e7\u0131s\u0131 kazand\u0131n\u0131z. Veritaban\u0131 modellemelerindeki incelikleri, Many-to-Many ve One-to-One ili\u015fkilerinin g\u00fcc\u00fcn\u00fc ke\u015ffettiniz. Django REST Framework ile API'ler olu\u015fturman\u0131n temellerini ve bu API'leri kimlik do\u011frulama ile g\u00fcvenli hale getirmenin yollar\u0131n\u0131 \u00f6\u011frendiniz. Ayr\u0131ca, uygulaman\u0131z\u0131n performans\u0131n\u0131 art\u0131rmak ve kullan\u0131c\u0131 deneyimini iyile\u015ftirmek i\u00e7in asenkron g\u00f6revlerin ve Celery'nin nas\u0131l kullan\u0131labilece\u011fini de g\u00f6rd\u00fcn\u00fcz. Son olarak, mobil uyumlu tasar\u0131mlar\u0131n \u00f6nemini ve Django'nun statik dosya y\u00f6netimi arac\u0131l\u0131\u011f\u0131yla medya sorgular\u0131n\u0131n nas\u0131l entegre edilebilece\u011fini tart\u0131\u015ft\u0131k.\n<\/p>\n<p>\n    Bu bilgiler, sizi sadece bir \"Django kullan\u0131c\u0131s\u0131\" olmaktan \u00e7\u0131kar\u0131p, daha bilin\u00e7li ve yetenekli bir \"Django geli\u015ftiricisi\" yapacakt\u0131r. Her zaman oldu\u011fu gibi, \u00f6\u011frenme s\u00fcreci devam eder ve bu edinilen bilgiler, daha b\u00fcy\u00fck ve iddial\u0131 projeler i\u00e7in sa\u011flam bir temel olu\u015fturur. Pratik yaparak, farkl\u0131 senaryolar\u0131 deneyerek ve yeni teknolojileri ke\u015ffederek kendinizi geli\u015ftirmeye devam etmeniz b\u00fcy\u00fck \u00f6nem ta\u015f\u0131maktad\u0131r. Unutmay\u0131n, en iyi \u00f6\u011frenme, uygulamad\u0131r.\n<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular<\/h3>\n<dl>\n<dt>Django REST Framework (DRF) neden kullan\u0131l\u0131r?<\/dt>\n<dd>DRF, Django \u00fczerinde RESTful API'ler geli\u015ftirmeyi son derece kolayla\u015ft\u0131ran g\u00fc\u00e7l\u00fc ve esnek bir k\u00fct\u00fcphanedir. Model tabanl\u0131 serialle\u015ftiriciler, viewset'ler, kimlik do\u011frulama ve izin mekanizmalar\u0131 gibi \u00f6zellikleriyle API geli\u015ftirme s\u00fcrecini h\u0131zland\u0131r\u0131r, kod tekrar\u0131n\u0131 azalt\u0131r ve daha g\u00fcvenli API'ler olu\u015fturman\u0131z\u0131 sa\u011flar. Mobil uygulamalar veya JavaScript \u00f6n u\u00e7lar\u0131 gibi farkl\u0131 istemcilerle veri al\u0131\u015fveri\u015fi yapmak i\u00e7in vazge\u00e7ilmezdir.<\/dd>\n<dt>Many-to-Many ve One-to-One ili\u015fkileri ne zaman kullanmal\u0131y\u0131m?<\/dt>\n<dd><code>ManyToManyField<\/code>, bir modelin bir\u00e7ok ba\u015fka modelle, o di\u011fer modellerin de ayn\u0131 \u015fekilde ilk modelle ili\u015fkili olabilece\u011fi durumlarda kullan\u0131l\u0131r (\u00f6rne\u011fin, bir \u00f6\u011frencinin birden fazla kursa kay\u0131t olmas\u0131 ve bir kursa birden fazla \u00f6\u011frencinin kay\u0131t olmas\u0131). <code>OneToOneField<\/code> ise iki model aras\u0131nda birebir bir ili\u015fki gerekti\u011finde kullan\u0131l\u0131r (\u00f6rne\u011fin, her kullan\u0131c\u0131n\u0131n yaln\u0131zca bir profil sayfas\u0131na sahip olmas\u0131 veya temel bir modele ek \u00f6zellikler eklemek i\u00e7in).<\/dd>\n<dt>Celery ne i\u015fe yarar ve ne zaman kullanmal\u0131y\u0131m?<\/dt>\n<dd>Celery, Django uygulaman\u0131z\u0131n performans\u0131n\u0131 art\u0131rmak i\u00e7in zaman al\u0131c\u0131 veya yo\u011fun i\u015flem gerektiren g\u00f6revleri arka planda asenkron olarak y\u00fcr\u00fctmeye yarayan bir da\u011f\u0131t\u0131lm\u0131\u015f g\u00f6rev kuyru\u011fu sistemidir. E-posta g\u00f6nderimi, resim i\u015fleme, rapor olu\u015fturma, veri senkronizasyonu gibi i\u015flemler i\u00e7in kullan\u0131lmal\u0131d\u0131r. Bu sayede web sunucunuzun kullan\u0131c\u0131 isteklerine daha h\u0131zl\u0131 yan\u0131t vermesini sa\u011flayarak kullan\u0131c\u0131 deneyimini iyile\u015ftirirsiniz.<\/dd>\n<dt>API g\u00fcvenli\u011fini nas\u0131l sa\u011flayabilirim?<\/dt>\n<dd>API g\u00fcvenli\u011fi i\u00e7in kimlik do\u011frulama (authentication) ve izin (permission) mekanizmalar\u0131n\u0131 kullanmal\u0131s\u0131n\u0131z. DRF, <code>TokenAuthentication<\/code>, <code>SessionAuthentication<\/code>, <code>JWTAuthentication<\/code> gibi y\u00f6ntemler sunar. \u0130zinler ise <code>IsAuthenticated<\/code>, <code>IsAdminUser<\/code> veya kendi yazaca\u011f\u0131n\u0131z \u00f6zel izin s\u0131n\u0131flar\u0131 ile belirli kaynaklara eri\u015fimi k\u0131s\u0131tlaman\u0131za olanak tan\u0131r. Her iste\u011fin g\u00fcvenli bir \u015fekilde do\u011frulanmas\u0131n\u0131 ve yetkilendirilmesini sa\u011flamak kritik \u00f6neme sahiptir.<\/dd>\n<dt>Mobil uyumlu bir Django sitesi nas\u0131l yap\u0131l\u0131r?<\/dt>\n<dd>Django bir arka u\u00e7 \u00e7at\u0131s\u0131 oldu\u011fundan, mobil uyumluluk (responsive design) genellikle frontend (\u00f6n y\u00fcz) teknikleriyle sa\u011flan\u0131r. CSS media query'lerini kullanarak farkl\u0131 ekran boyutlar\u0131na g\u00f6re stil kurallar\u0131 tan\u0131mlayabilirsiniz. Meta viewport etiketini HTML ba\u015fl\u0131\u011f\u0131na eklemek, mobil cihazlar\u0131n sayfay\u0131 do\u011fru \u00f6l\u00e7eklendirmesi i\u00e7in \u00f6nemlidir. Django'nun statik dosya y\u00f6netimi bu CSS ve JavaScript dosyalar\u0131n\u0131 projenize kolayca entegre etmenizi sa\u011flar.<\/dd>\n<\/dl>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Django \u00f6\u011frenim ser\u00fcveninizin 10. g\u00fcn\u00fcne ho\u015f geldiniz! Bu kritik a\u015famada, temel bilgilerinizi sa\u011flamla\u015ft\u0131rarak daha karma\u015f\u0131k veritaban\u0131 ili\u015fkilerini, g\u00fc\u00e7l\u00fc&hellip;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-34261","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Day 10 Django: \u0130leri Seviye Veritaban\u0131 ve API Entegrasyonu<\/title>\n<meta name=\"description\" content=\"Django \u00f6\u011frenim ser\u00fcveninizin 10. g\u00fcn\u00fcne ho\u015f geldiniz! Bu kritik a\u015famada, temel bilgilerinizi sa\u011flamla\u015ft\u0131rarak daha karma\u015f\u0131k veritaban\u0131 ili\u015fkilerini, g\u00fc\u00e7l\u00fc RESTful API&#039;ler geli\u015ftirmeyi ve g\u00fcvenlik \u00f6nlemlerini nas\u0131l uygulayaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m ke\u015ffedece\u011fiz. Art\u0131k sadece web sayfalar\u0131 tasarlamakla kalmayacak, ayn\u0131 zamanda uygulamalar\u0131n\u0131z\u0131 veri odakl\u0131 ve etkile\u015fimli hale getireceksiniz.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/day-10-django-ileri-seviye-veritabani-ve-api-entegrasyonu\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Day 10 Django: \u0130leri Seviye Veritaban\u0131 ve API Entegrasyonu\" \/>\n<meta property=\"og:description\" content=\"Django \u00f6\u011frenim ser\u00fcveninizin 10. g\u00fcn\u00fcne ho\u015f geldiniz! Bu kritik a\u015famada, temel bilgilerinizi sa\u011flamla\u015ft\u0131rarak daha karma\u015f\u0131k veritaban\u0131 ili\u015fkilerini, g\u00fc\u00e7l\u00fc RESTful API&#039;ler geli\u015ftirmeyi ve g\u00fcvenlik \u00f6nlemlerini nas\u0131l uygulayaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m ke\u015ffedece\u011fiz. Art\u0131k sadece web sayfalar\u0131 tasarlamakla kalmayacak, ayn\u0131 zamanda uygulamalar\u0131n\u0131z\u0131 veri odakl\u0131 ve etkile\u015fimli hale getireceksiniz.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/day-10-django-ileri-seviye-veritabani-ve-api-entegrasyonu\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-13T23:02:02+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"29 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/day-10-django-ileri-seviye-veritabani-ve-api-entegrasyonu\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/day-10-django-ileri-seviye-veritabani-ve-api-entegrasyonu\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Day 10 Django: \u0130leri Seviye Veritaban\u0131 ve API Entegrasyonu\",\"datePublished\":\"2025-11-13T23:02:02+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/day-10-django-ileri-seviye-veritabani-ve-api-entegrasyonu\/\"},\"wordCount\":3928,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/day-10-django-ileri-seviye-veritabani-ve-api-entegrasyonu\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/day-10-django-ileri-seviye-veritabani-ve-api-entegrasyonu\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/day-10-django-ileri-seviye-veritabani-ve-api-entegrasyonu\/\",\"name\":\"Day 10 Django: \u0130leri Seviye Veritaban\u0131 ve API Entegrasyonu\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-13T23:02:02+00:00\",\"description\":\"Django \u00f6\u011frenim ser\u00fcveninizin 10. g\u00fcn\u00fcne ho\u015f geldiniz! Bu kritik a\u015famada, temel bilgilerinizi sa\u011flamla\u015ft\u0131rarak daha karma\u015f\u0131k veritaban\u0131 ili\u015fkilerini, g\u00fc\u00e7l\u00fc RESTful API'ler geli\u015ftirmeyi ve g\u00fcvenlik \u00f6nlemlerini nas\u0131l uygulayaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m ke\u015ffedece\u011fiz. Art\u0131k sadece web sayfalar\u0131 tasarlamakla kalmayacak, ayn\u0131 zamanda uygulamalar\u0131n\u0131z\u0131 veri odakl\u0131 ve etkile\u015fimli hale getireceksiniz.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/day-10-django-ileri-seviye-veritabani-ve-api-entegrasyonu\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/day-10-django-ileri-seviye-veritabani-ve-api-entegrasyonu\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/day-10-django-ileri-seviye-veritabani-ve-api-entegrasyonu\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Day 10 Django: \u0130leri Seviye Veritaban\u0131 ve API Entegrasyonu\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Day 10 Django: \u0130leri Seviye Veritaban\u0131 ve API Entegrasyonu","description":"Django \u00f6\u011frenim ser\u00fcveninizin 10. g\u00fcn\u00fcne ho\u015f geldiniz! Bu kritik a\u015famada, temel bilgilerinizi sa\u011flamla\u015ft\u0131rarak daha karma\u015f\u0131k veritaban\u0131 ili\u015fkilerini, g\u00fc\u00e7l\u00fc RESTful API'ler geli\u015ftirmeyi ve g\u00fcvenlik \u00f6nlemlerini nas\u0131l uygulayaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m ke\u015ffedece\u011fiz. Art\u0131k sadece web sayfalar\u0131 tasarlamakla kalmayacak, ayn\u0131 zamanda uygulamalar\u0131n\u0131z\u0131 veri odakl\u0131 ve etkile\u015fimli hale getireceksiniz.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/day-10-django-ileri-seviye-veritabani-ve-api-entegrasyonu\/","og_locale":"tr_TR","og_type":"article","og_title":"Day 10 Django: \u0130leri Seviye Veritaban\u0131 ve API Entegrasyonu","og_description":"Django \u00f6\u011frenim ser\u00fcveninizin 10. g\u00fcn\u00fcne ho\u015f geldiniz! Bu kritik a\u015famada, temel bilgilerinizi sa\u011flamla\u015ft\u0131rarak daha karma\u015f\u0131k veritaban\u0131 ili\u015fkilerini, g\u00fc\u00e7l\u00fc RESTful API'ler geli\u015ftirmeyi ve g\u00fcvenlik \u00f6nlemlerini nas\u0131l uygulayaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m ke\u015ffedece\u011fiz. Art\u0131k sadece web sayfalar\u0131 tasarlamakla kalmayacak, ayn\u0131 zamanda uygulamalar\u0131n\u0131z\u0131 veri odakl\u0131 ve etkile\u015fimli hale getireceksiniz.","og_url":"https:\/\/fatihsoysal.com\/blog\/day-10-django-ileri-seviye-veritabani-ve-api-entegrasyonu\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-13T23:02:02+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"29 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/day-10-django-ileri-seviye-veritabani-ve-api-entegrasyonu\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/day-10-django-ileri-seviye-veritabani-ve-api-entegrasyonu\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Day 10 Django: \u0130leri Seviye Veritaban\u0131 ve API Entegrasyonu","datePublished":"2025-11-13T23:02:02+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/day-10-django-ileri-seviye-veritabani-ve-api-entegrasyonu\/"},"wordCount":3928,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/day-10-django-ileri-seviye-veritabani-ve-api-entegrasyonu\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/day-10-django-ileri-seviye-veritabani-ve-api-entegrasyonu\/","url":"https:\/\/fatihsoysal.com\/blog\/day-10-django-ileri-seviye-veritabani-ve-api-entegrasyonu\/","name":"Day 10 Django: \u0130leri Seviye Veritaban\u0131 ve API Entegrasyonu","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-13T23:02:02+00:00","description":"Django \u00f6\u011frenim ser\u00fcveninizin 10. g\u00fcn\u00fcne ho\u015f geldiniz! Bu kritik a\u015famada, temel bilgilerinizi sa\u011flamla\u015ft\u0131rarak daha karma\u015f\u0131k veritaban\u0131 ili\u015fkilerini, g\u00fc\u00e7l\u00fc RESTful API'ler geli\u015ftirmeyi ve g\u00fcvenlik \u00f6nlemlerini nas\u0131l uygulayaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m ke\u015ffedece\u011fiz. Art\u0131k sadece web sayfalar\u0131 tasarlamakla kalmayacak, ayn\u0131 zamanda uygulamalar\u0131n\u0131z\u0131 veri odakl\u0131 ve etkile\u015fimli hale getireceksiniz.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/day-10-django-ileri-seviye-veritabani-ve-api-entegrasyonu\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/day-10-django-ileri-seviye-veritabani-ve-api-entegrasyonu\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/day-10-django-ileri-seviye-veritabani-ve-api-entegrasyonu\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Day 10 Django: \u0130leri Seviye Veritaban\u0131 ve API Entegrasyonu"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/34261","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=34261"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/34261\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=34261"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=34261"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=34261"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}