{Django Öğreniyorum}
Günümüz kusursuzcuları için ağ çatısı

Bir Bakışta Django

Django, hızlı bir haber odası ortamında geliştirildiğinden, ortak ağ geliştirme görevlerinih ızlı ve kolay kapmak için tasarlandı. Django ile veritabanı odaklı bir ağ uygulaması yazmanın nasıl yapıldığına dair gayri resmi bir genel bakış atalım.

Bu belgenin amacı, Django’nun nasıl çalıştığını anlamak için yeterli teknik ayrıntıları vermektir. Ancak bu bir ders veya kaynak olarak tasarlanmamıştır. Bir projeye başlamaya hazır olduğunuzda, öğreticiyle başlayabilir veya daha ayrıntılı belgelere dalabilirsiniz.

Kalıbınızı Tasarlayın

Django’yu bir veritabanı olmadan kullanabilmenize rağman, veritabanı düzeninizi Python kodunda tanımladığınız bir nesne-ilişkisel eşlemeyle birlikte gelir.

Veri-kalıbı sözdizimi, kalıplarınızı göstermek için birçok zengin yol sunar. Şu ana kadar, yıllarca süren veritabanı şeması sorunlarını çözmüştür. İşte hızlı bir örnek:

benimsite/haberler/models.py


from django.db import models

class Haberci(models.Model):
  tam_adi = models.CharField(max_length=70)

  def __str__(self):
      return self.tam_adi

class Makale(models.Model):
  yayim_tarihi = models.DateField()
  baslik = models.CharField(max_length=200)
  icerik = models.TextField()
  haberci = models.ForeignKey(Haberci, on_delete=models.CASCADE)

  def __str__(self):
      return self.baslik
  

Kurulumu Yap

Şimdi, veritabanı tablolarını doğal olarak oluşturmak için Django komut satırı yardımcı programını çalıştırın:


$ python manage.py migrate
  

Göç komutu (migrate) mevcut tüm modellerinize bakar ve halihazırda var olmayan tablolar için veritabanınızda tablolar oluşturur ve isteğe bağlı olarak daha zengin şema kontrolü sağlanır.


Ücretsiz API’nin tadını çıkarın

Bununla, verilerinize erişmek için özgür ve zengin bir Python API‘si var. API anında oluşturulur, kod üretimi gerekli değildir:


  # Oluşturduğumuz modelleri "haber" uygulamamızdan içe aktarın
  >>> from news.models import Haberci, Makale

  # Haberciler henüz örgüde değiller.
  >>> Haberci.objects.all()
  <QuerySet []>

  # Yeni bir Haberci oluştur
  >>> r = Haberci(tam_adi='Çapanoğlu Agâh Efendi')

  # Nesneyi veritabanına kaydedin. save() ögesini eklem olarak çağırmalısınız.
  >>> r.save()

  # Şimdi bir kimliği (ID) var. id ögesini eklem olarak çağırıp görebilirsiniz.
  >>> r.id
  1

  # Şimdi yeni haberci veritabanında.
  >>> Haberci.objects.all()
  <QuerySet [<Haberci: Çapanoğlu Agâh Efendi>]>

  # Alanlar, Python nesnesinde öznitelikler olarak temsil edilir. tam_adi özniteliği ögesini eklem olarak gösterek çağırın.
  >>> r.tam_adi
  'Çapanoğlu Agâh Efendi'

  # Django zengin bir veritabanı arama API'si sağlar.
  >>> Haberci.objects.get(id=1)
  <Haberci: Çapanoğlu Agâh Efendi>
  >>> Haberci.objects.get(tam_adi__startswith='Çapanoğlu')
  <Haberci: Çapanoğlu Agâh Efendi>
  >>> Haberci.objects.get(tam_adi__contains='pano')
  <Haberci: Çapanoğlu Agâh Efendi>
  >>> Haberci.objects.get(id=2)
  Traceback (most recent call last):
      ...
  DoesNotExist: Reporter matching query does not exist.

  # Makale oluştur.
  >>> from datetime import date
  >>> a = Makale(yayim_tarihi=date.today(), baslik='Django harika',
  ...     icerik='Ivır zıvır.', haberci=r)
  >>> a.save()

  # Şimdi makale veritabanında.
  >>> Makale.objects.all()
  <QuerySet [<Makale: Django harika>]>

  # Makale nesneleri, ilgili Haberci nesnelerine API erişimi sağlar.
  >>> r = a.haberci
  >>> r.tam_adi
  'Çapanoğlu Agâh Efendi'

  # Ve tam tersi: Haberci nesneleri Makale nesnelerine API erişimi sağlar.
  >>> r.makale_set.all()
  <QuerySet [<Makale: Django harika>]>

  # API, ilişkileri ihtiyacınız olan kadarıyla izler ve verimli bir şekilde gerçekleştirir.
  # Sahnelerin arkasında sizin için birleşir.
  # Bu, "Çapanoğlu" ile başlayan bir haberci tanımlı tüm makaleleri bulur.
  >>> Makale.objects.filter(haberci__tam_adi__startswith='Çapanoğlu')
  <QuerySet [<Makale: Django harika>]>

  # Bir nesneyi niteliklerini değiştirerek ve save() yöntemini kullanarak değiştirin.
  >>> r.tam_adi = 'Şinasi'
  >>> r.save()

  # Bir nesneyi delete() eklemi ile silebilirsiniz.
  >>> r.delete()

Dinamik bir yönetici arayüzü: sadece iskele değil, tüm ev var.

Django, kalıplarınızı tanımlandıktan sonra kimliği doğrulanmış kullanıcıların nesneleri ekleme, değiştirme ve silme olanağı veren bir ağ sitesi olan, usta, üretime hazır bir yönetici arabirimi doğal olarak oluşturabilir. Kalıbınızı yönetici sitesine kaydetmek kadar kolaydır:

benimsite/haberler/models.py


from django.db import models

class Makale(models.Model):
    yayim_tarihi = models.DateField()
    baslik = models.CharField(max_length=200)
    icerik = models.TextField()
    haberci = models.ForeignKey(Haberci, on_delete=models.CASCADE)
  

benimsite/haberler/admin.py


from django.contrib import admin

from . import models

admin.site.register(models.Makale)

Buradaki felsefe, sitenizin bir görevli, bir müşteri veya belki de sadece sizin tarafından düzenlenmesidir ve yalnızca içeriği yönetmek için arka uç arabirimleri oluşturmakla uğraşma zorunda kalmak istemezsiniz.

Django uygulamalarını oluştururken kullanılan tipik bir iş akışı, modeller oluşturmak ve yönetici sitelerini olabildiğince hızlı çalıştırmaktır; böylece görevlileriniz (veya müşterileriniz, ziyaretçileriniz, üyeleriniz) veri toplamaya başlayabilir. Ardından, verilerin halka sunulma biçimini geliştirin.


URLleri tasarlayın

Temiz, şık bir URL şeması, yüksek kaliteli bir ağ uygulamasında önemli bir ayrıntıdır. Django güzel bir URL tasarımını teşvik eder ve .php veya .asp gibi URL’lerde herhangi bir hata yapmaz.

Bir uygulama için URL’ler tasarlamak için bir URLconf adlı Python eklentisi oluşturursunuz. Uygulamanız için içindekiler tablosu, URL kalıpları ile Python geri arama işlevleri arasında basit bir imgeleme içerir. URLconf’lar, URL’leri Python kodundan ayırmak için de kullanılır. Yukarıdaki Haberci/Makale örneği için URLconf nasıl olacağını aşağıda görebilirsiniz:

benimsite/haberler/urls.py


from django.urls import path

from . import views

urlpatterns = [
    path('makaleler/<int:yil>/', views.yillik_arsiv),
    path('makaleler/<int:yil>/<int:ay>/', views.aylik_arsiv),
    path('makaleler/<int:yil>/<int:ay>/<int:pk>/', views.makale_ayrintisi),
]
  

Yukarıdaki kod, URL yollarını Python geri arama işlevlerine (“views”) eşleştirir. Yol dizeleri, URL’lerden değerleri “yakalama” için değiştirge etiketleri kullanır. Bir kullanıcı bir sayfayı istediğinde, Django her yoldan sırayla geçer ve istenen URL ile eşleşen ilk satırda durur. (Hiçbiri eşleşmezse, Django özel durum 404 görünümü çağırır.) Yollar, yükleme zamanında normal ifadeler halinde derlendiğinden, çok hızlıdır.

URL kalıpları eşleştiğinde, Django, Python işlevi olan belirli görünümü çağırır. Her görünüm (‘views’) bir istek nesnesi tarafından iletilir - talep meta verileri içerir - ve desende yaklanan değerler de.

Örneğin, bir kullanıcı “/makaleler/2005/05/39323” URL’sini isterse, Django haberler.views.makale_ayrintisi(request, year=2005, ay=5, pk=39323) işlevini çağırır.


Görünümleri yaz (views)

Her görünüm, iki şeyden birini yapmaktan sorumludur: İstenen sayfa için içeriği içeren bir HttpResonse nesenesini döndürme veya Http404 gibi bir istisna yükseltere. Gerisi size kalmış.

Genellikle, bir görünüm değiştirgelere göre veri alır, bir şablon yükler ve şablonu alınan verilerle işler. Yukarıdaki yillik_arsiv için bir örnek görüntü var:

benimsite/haberler/views.py


from django.shortcuts import render

from .models import Makale

def yillik_arsiv(request, yil):
    a_listesi = Makale.objects.filter(yayim_tarihi__year=yil)
    baglam = {'yil': yil, 'makale_listesi': a_listesi}
    return render(request, 'haberler/yillik_arsiv.html', baglam)

Bu örnek, birkaç güçlü özelliklere sahip olan Django şablon örgüsünü kullanmaktadır; ancak programcı olmayanların kullanması için yeterince basit kalmaya çabalamaktadır.


Şablonlarınızı tasarlayın

Yukarıdaki kod, haberler/yillik_arsiv.html şablonunu yükler.

Django, şablonlar arasında fazlalığı azaltmanızı sağlayan bir şablon arama yoluna sahiptir. Django ayarlarınızda, DIRS ile şablonları denetlemek için dizinlerin bir listesini belirtirsiniz. İlk dizinde bir şablon yoksa, ikinci dizini denetler, vb.

Diyelim ki haberler/yillik_arsiv.html şablon bulundu. İşte bunun gibi görünebilir:

benimsite/haberler/templates/haberler/yillik_arsiv.html


{% extends "temel.html" %}

{% block title %}{{ yil }} için makaleler{% endblock %}

{% block content %}
<h1>{{ yil }} için makaleler</h1>

{% for makale in makale_listesi %}
    <p>{{ makale.baslik }}</p>
    <p>{{ makale.haberci.tam_adi }} tarafından</p>
    <p>Yayımlanma {{ makale.yayim_tarihi|date:"F j, Y" }}</p>
{% endfor %}
{% endblock %}

Değişkenler çift kıvrımlı parantezlerle çevrilidir. {{makale.baslik}}, “Makale başlığı özniteliğinin değerini verin” anlamına gelir. Ancak noktalar yalnızca özellik taramasıiçin kullanılmaz. Ayrıca sözlük anahtarlı arama, dizin arama ve işlev çağrıları yapabilirler.

Not: {{makale.yayim_tarihi | date:”F j, Y”}} bir Unix tarzı “boru” yani “|” karakterini kullanır. Buna şablon süzgeci denir ve bir değişkenin değerini süzmek için bir yöntemdir. Bu durumda tarih süzgeci bir Python datetime nesnesini biçim olarak biçimler (PHP date işlevinde olduğu gibi)

Birlikte istediğiniz kadar süzgeç zinciri yapabilirsiniz. Özel şablon süzgeçleri yazabilirsiniz. Sahnelerin arkasında özel Python kodunu çalıştıran özel şablon etiketleri yazabilirsiniz.

Son olarak, Django “şablon kalıtımı” kavramını kullanmaktadır. {% Extends “temel.html” %} ne işe yarar? İlk önce bir blok yığını tanımlayan “temel” adındaki şablonu yükleyin ve blogkları aşağıdaki bloklarla doldurun anlamına gelir. Kısacası, şablonlarda fazlalıkları önemli ölçüde azaltabilirsiniz. Her şablon yalnızca ilgili şablon için benzersi olanları tanımlamalıdır.

İşe sabit dosyaların kullanımı da dahil olmak üzere “temel.html” şablonu şöyle görünebilir.


{%load static %}
<html>
<head>
    <title>{%block title %}{%endblock %}</title>
</head>
<body>
    <img src="{%static "images/sitelogo.png" %}" alt="Logo" />
    {%block content %}{%endblock %}
</body>
</html>

Basitçe, sitenin görünümünü ve şeklini (sitenin logosuyla birlikte) tanımlar ve doldurulması için iç şablonlara “yuvalar” sağlar. Bu, bir siteyi tek bir dosyayı değiştirme kadar kolaylıkla yeniden tasarlamaktır.

Ayrıca, iç şablonlarını yeniden kullanırken, farklı temel şablonlarla bir sitenin birden çok sürümünü oluşturmanıza olanak tanır. Django’nun yaratıcıları, sitenin çarpıcı biçimde farklı telefon sürümlerini oluşturmak için tekniği basitçe yeni bir temel şablon oluşturarak kullandı.

Başka bir örgüyü tercih ederseniz, Django’nun şablon görügüsünü kullanmak zorunda kalmadığınızı unutmayın. Django’nun şablon örgüsü Django’nun model katmanı ile özellikle iyi gömülü olsa da, hiçbir şey onu kullanmaya zorlamaz. Bu konuda Django’nun veritabanı API’sini kullanmak zorunda değilsiniz. Başka bir veritabanı soyutlama katmanı kullanabilirsiniz, XML dosyalarını okuyabilir, dosyaları diskten okuyabilir veya istediğiniz herhangi bir şey okuyabilirsiniz. Django’nun her bir parçası (modeller, görünümler, şablonlar) diğerlerinden ayrılır.


Bu sadece yüzey

Bu sadece Django’nun işlevselliği hakkında hızlı bir genel bakış olmuştur. Bazı kullanışlı özellikler şöyle:

Bir sonraki belirgin adımlar Django’yu indirmek, dersleri okumak, topluluğa katılmak içindir. İlginiz için teşekkürler.

Başlangıç Hızlı Kurulum Rehberi