BİL203U-PROGRAMLAMA II
Ünite 8: Django ile Web Sitesi Hazırlama
Giriş
Django, BSD yani özgür yazılım lisansı ile lisanslanmış, açık kaynak kodlu, Python dili için dizayn edilmiş yüksek seviyeli bir web uygulaması geliştirme platformudur. Adını caz gitaristi Django Reinhardt’dan almıştır. Modülerlik, tekrar kullanılabilirlik ve hızlı bir geliştirme ortamı sunmak üzere tasarlanmıştır. Django, detaylı hata raporları sunmasının yanında, sunduğu dinamik yönetim paneli ile, projeye özel kayıt ekleme, düzenleme ve silme metotlarını da içermektedir. Django ayrıca MVT (Model View Template) mimari yapısını kullanan yüksek seviyeli bir web geliştirme platformudur. Django, bilimsel işlem platformları, içerik yönetim sistemleri ve sosyal ağ yönetimi gibi farklı alanlarda kullanılmaktadır.
Django Kurulumu
Django son sürümünün kurulumu için https://www.djangoproject.com/download/ adresindeki pip komutu, komut satırına yazılarak gerçekleştirilebilir. Kurulum pip üzerinden gerçekleşecek ve gerekli tüm paketler de kurulacaktır.
Proje Oluşturma
Bir web uygulaması geliştirmek için öncelikle bir proje oluşturulması gerekmektedir. Linux veya Windows ortamı olması farketmeksizin bir komut satırı açılmalıdır. Daha sonra komut satırından projenin oluşturulması istenilen klasöre girilmelidir. Ardından aşağıdaki komut çalıştırılmalıdır:
django-admin startproject proje_adı
Komut çalıştırıldığında hata vermiyorsa aşağıdaki yapıda bir proje oluşturulmuş olacaktır.
proje_adı/ manage.py proje_adı/ __init__.py settings.py urls.py wsgi.py
proje_adı klasörü sadece iki tane nesne içeren proje kapsayıcısıdır.
manage.py: Bu dosya, proje ile komut satırı aracılığıyla iletişim kurmak için hazırlanmış yerel bir Django- admin’dir. Veritabanı senkronizasyonu, geliştirme sunucusu başlatma gibi görevleri gerçekleştirmeye yarayan komut satırı yardımcı programıdır.
proje_adı: Alt klasördür ve projedeki gerçek Python paketidir. Dört adet dosya içermektedir.
__init__.py: Bu dosya olduğu için, bu klasör bir paket olarak kabul edilir.
settings.py: Adından da anlaşılacağı gibi, bu dosya projedeki tüm ayarları yönetmektedir.
urls.py: Sitedeki linkleri kontrol eden, tüm bağlantıları ve metotları yönlendiren ana işlevdir.
wsgi.py: Proje WSGI (Web Server Gateway Interface) üzerinden sunulması gerekiyorsa, uyumlu web sunucular için bir giriş noktası görevi görmektedir.
Uygulamayı oluşturmak için, komut satırında manage.py dosyası ile aynı klasörde iken aşağıdaki komutun çalıştırılması gerekmektedir.
python manage.py startapp webapp
Uygulamanızı proje ayarlarında manuel olarak içeri aktarmanız gerekmektedir. Bunun için proje_adı/ settings.py dosyasını açarak içerisine projenizi eklemelisiniz. Yukarıdaki örnek kodda proje adı webapp’dir
Arayüz Oluşturma
Bir görüntüleme fonksiyonu olan arayüz, sadece web isteği (web request) alan ve web yanıtı (web response) döndüren bir Python metodudur. Döndürülen bu yanıt, bir XML belgesi, CSV dosyası, 404 hatası, ses dosyası, web sayfasının HTML içeriği gibi farklı içerikler olabilir. Web sayfalarının oluşturulması için arayüz/görünüm (view) kullanılmaktadır ve bu sayfaların görünür olabilmesi için sayfaya ait bir URL ile ilişkilendirilmesi gerekmektedir. Django’da arayüzler, webapp/views.py dosyasında oluşturulmalıdır. Bu işlem için aşağıdaki kod çalıştırılır:
from django.shortcuts import render
from django.http import HttpResponse
def hello(request): text = """Django sayfamıza hoşgeldiniz!!!"""
return HttpResponse(text)
Oluşturulan her bir proje içinde “urls.py” dosyası oluşturulmalı ve bu dosyanın ana “urls.py” dosyasına eklenmelidir. Böylece tüm rotaların tek bir dosyada tutulması yerine, her bir proje kendi içinde url yapısını taşıyarak, taşınabilir bir format oluşturulacaktır.
Şablon Oluşturma (Template)
Html arayüz oluşturmak için HttpResponse kullanıldı. Fakat Html sayfalarını oluşturmak için bu yöntem en iyi seçenek değildir. Django, MVT (Model View Template) yapısını desteklediği için bu yapı üzerinden projeyi oluşturmak daha uygun olacaktır. Yeni oluşturulan webapp klasörünün içerisine templates klasörü ve içine hello.html dosyasını oluşturalım. Şablon html dosyası için de view.py dosyasının içine “html_hello” isimli bir metot tanımlayalım. Bu işlem için aşağıdaki kod çalıştırılır:
Kod (webapp/view.py): from django.shortcuts import render from django.http import HttpResponse def html_hello(request): return render(request, "hello.html", {}) def hello(request):
text = """Django sayfamıza hoşgeldiniz!!!""" return HttpResponse(text) Kod (webapp/templates/hello.html): <h1>Template İçerik</h1> <div>hello.html sayfasının içeriğini görmektesiniz. </div>
Projenin ayarlarının tutulduğu settings.py dosyası içinde tanımlı TEMPLATES ayarlarına da yeni oluşturulan templates klasörü tanımlanmalıdır. Bu dosya içerisine eklenmesi gereken satır ‘DIRS’: [os. path.join(BASE_DIR,’templates’)], şeklindedir.
Şablon dosyalara parametre de gönderilebilmektedir. Bu parametreler öncelikle url yönlendirmesi yapılan “urls.py” dosyasına eklenmeli ve sonrasında, “views.py” dosyasına da ilgili parametreyi alan bir metot tanımlanmalıdır. Parametrelerin gösterileceği şablon dosyalar da, templates klasörü altında oluşturulmalıdır. Eğer gönderilecek veri bir sayı ise, urls.py dosyasına url parametresi olarak, veri bir metin ise de şeklinde girilmelidir.
Url dönüştürücü tipi örnekleri aşağıdaki gibidir:
str; <str:veri> : Url ayırıcı “/” haricinde boş olmayan herhangi bir metin ile eşleşir.
int; <int:veri> : Sıfır veya herhangi bir pozitif tamsayı ile eşleşir.
slug; <slug:veri> : Normalize edilmiş ASCII metinleridir. Küçük harfler, numaralar ve “-” işareti içerebilir. Python ile kod yazmaya hoş geldiniz! => python-ile-kod-yazmaya- hos-geldiniz
uuid: <uuid:veri> : 16 byte yer kaplayan, UUID (Universally Unique Identifier)’a karşılık gelmektedir. 8-4- 4-4-12 karakter olmak üzere 36 karakter 5 grup halinde gösterilmektedir.
django.urls.path; <path:veri> : Boş olmayan, yol ayracı “/” işareti de dahil olmak üzere herhangi bir metin verisi içerebilir.
Oluşturulan html dosyalara parametreler, url üzerinden gönderilmektedir. Sırasıyla iki şablonun parametre ile çağrılması aşağıdaki şekildedir:
sayi_goster şablonu için kullanılacak url: http://127.0.0.1:8000/webapp/sayi_goster/26020 mesaj_goster şablonu için kullanılacak url: http://127.0.0.1:8000/webapp/mesaj_goster/Kargo%20za man%C4%B1nda%20gelmedi
Model Oluşturma
Django’da model, veritabanında tablo veya koleksiyonu temsil eden bir sınıftır. Bu sınıfın her özelliği de tablo veya koleksiyonun bir alanını göstermektedir. Modeller, “models.py” dosyasında tanımlanmaktadır. Örnek kodda “webapp/models.py” dosyasında tanımlanmıştır.
Kod (webapp/models.py): from django.db import models class Kartvizit(models.Model):
isim = models.CharField(max_length = 50) website = models.CharField(max_length = 50) eposta = models.CharField(max_length = 50) telefon = models.DecimalField(max_digits=10, decimal_places=0) class Meta: db_table = "kartvizit" Django, tablo veya koleksiyonu otomatik olarak projeAdı_modelAdı şeklinde isimlendirmektedir. Meta sınıfında tanımlanan “db_table” özelliği ile de, veritabanında oluşturulacak olan tablonun adı, programcı tarafından istenildiği gibi isimlendirilebilmektedir. Model oluşturulduktan sonra, Django ile veritabanında tablolar oluşturulmaktadır. Python ile MySQL bağlantısı kurulabilmesi amacıyla, Django’nun sitesinde tavsiye edilen bağlantı sürücülerinden birini yüklemek için aşağıdaki kodlardan yararlanılabilir.
pip install mysql-connector-python
veya
pip install mysqlclient
“proje_adi/settings.py” dosyasının içerisinde MySQL veritabanı bağlantı bilgileri girilmelidir. MySQL kurulumundaki kullanıcı adı, şifresi ve oluşturulan veritabanı adı bilgileri ilgili alanlara girilmesi gerekmektedir.
Proje içerisindeki tüm modelleri tarayarak migration dosyalarını oluşturan komut şu şekildedir:
python manage.py makemigrations
Oluşturulan migration dosyalarının çalıştırılarak veritabanı ile eşleştirilerek güncellenmesi için çalıştırılan komut şu şekildedir:
python manage.py migrate
Projede herhangi bir problem olup olmadığı aşağıdaki kod yardımıyla kolayca bulunabilir:
python manage.py check
Verinin Düzenlenmesi (CRUD-Create Retrieve Update Delete) İşlemleri
Django, kurulum ve bağımlılık sorunu olmadan hızlı bir şekilde web uygulaması oluşturmaya izin veren bir web geliştirme platformu sunmaktadır. MVT (Model Görünüm Şablon) mimarisini temel alarak CRUD (Oluştur Al Güncelle Sil) işlemlerini gerçekleştirir. CRUD, veritabanındaki bir tablo üzerinde Oluşturma, Alma, Güncelleme ve Silme işlemlerini gerçekleştirmek anlamına gelmektedir.
Oluştur: Veritabanındaki bir tabloda yeni kayıtlar oluşturma veya ekleme
Al: Mevcut girdileri bir liste olarak okuma, alma, arama veya görüntüleme (Liste Görünümü) veya belirli bir kaydı ayrıntılı olarak alma (Ayrıntılı Görünüm)
Güncelle: Veritabanındaki bir tablodaki mevcut girişleri güncelleme veya düzenleme
Sil: Veritabanındaki bir tablodaki mevcut girişleri silme, devre dışı bırakma veya kaldırma
Form İşlemleri
Bir Form sınıfı oluşturulduğunda, en önemli kısım form alanlarının tanımlanmasıdır. Formdaki her alanın, kendine özel doğrulama mantığı vardır. Formlar temel olarak kullanıcıdan veri alabilmek ve bu verileri veritabanlarındaki mantıksal işlemler için kullanılır. Örnek olarak bir kullanıcı adı, e-posta adresi, şifre vb. verilerin girdi olarak kaydedilmesi verilebilir.
Django’da form oluşturmak, bir model oluşturmaya benzemektedir. Form oluştururken Django sınıfından miras alınması gerekmekte ve sınıf nitelikleri form alanları olacaktır. Django, Django formlarında tanımlanan alanları HTML veri giriş alanları ile eşleştirir.
Django, formlarla ilgili üç farklı çalışma yapmaktadır:
• Verileri işlemeye hazır hale getirmek için hazırlamak ve yeniden yapılandırmak • Veriler için HTML formları oluşturma • İstemciden gönderilen form ile verileri almak ve işlemek
Django formları ile yapılan her türlü geliştirmenin, gelişmiş HTML öğeleriyle yapılabileceği unutulmamalıdır. Django’nun buradaki artısı, geliştirmeyi özellikle doğrulama kısmını daha kolay ve verimli hale getirmesidir.
Bir Görünümde Form Kullanma
GET ve POST olmak üzere iki tür HTTP isteği vardır. Django’da, görünüme parametre olarak iletilen istek (request) nesnesinin, isteğin türünün ayarlandığı “method” adlı bir özelliği vardır ve POST aracılığıyla iletilen tüm verilere request.POST sözlüğü aracılığıyla erişilebilir.
Giriş sayfasının görünümünü “webapp/views.py” dosyasına ekleyelim.
Kod (webapp/views.py): ... from myapp.forms import LoginForm def login(request): username = "Giriş yapılmadı" if request.method == "POST": #Get the posted form MyLoginForm = LoginForm(request.POST) if MyLoginForm.is_valid(): username = MyLoginForm.cleaned_data['username'] else: MyLoginForm = Loginform() return render(request, 'loggedin.html', {"username" : username})
Görünüm, login.html aracılığıyla gönderilen giriş formunun sonucunu gösterecektir.
Giriş sayfası (login) hazırlandığında, form işleminden sonra yönlendirilecek bir loggedin.html sayfasına ihtiyaç duyulacaktır.
Kod (webapp/loggedin.html): <html> <body> Hoşgeldiniz <strong> {{username}}</strong>
En son olarak da, “webapp/urls.py” dosyasına yeni sayfaların yönlendirmeleri ilave edilmelidir.
Kodun çalıştırılması sırasında hata oluşursa, verilen hata dikkatli bir şekilde incelenmeli ve çözüm yolu aranmalıdır. Özellikle yeni oluşturulan dosyaların doğru klasör yapısı altında olduğuna dikkat edilmelidir.
Yönetici Arayüzü
Django, yönetimsel işlemler için kullanıma hazır bir kullanıcı arabirimi sağlamaktadır. Bir web projesi için yönetici arayüzü oldukça önemlidir, bu yüzden Django, proje modellerine göre otomatik olarak yönetici kullanıcı arayüzü oluşturur.
Yönetici Arayüzünü Başlatma
Yönetici arayüzü, Django.countrib modülüne bağlıdır. Çalışması için bazı modüllerin “proje_adı/settings.py” dosyasındaki INSTALLED_APPS ve MIDDLEWARE_CLASSES demetlerine (tupple) aktarıldığından emin olmanız gerekir.
INSTALLED_APPS bölümü şu şekilde olmalıdır: INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'uygulama_adı', )
MIDDLEWARE_CLASSES kısmı da şu şekilde olmalıdır: MIDDLEWARE_CLASSES = ( 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddlewar e', 'django.contrib.messages.middleware.MessageMiddleware ', 'django.middleware.clickjacking.XFrameOptionsMiddlew are', )
Eğer daha önce veritabanı oluşturulamadı ise, Django sunucusunu başlatmadan önce, Yönetici Arayüzüne erişebilmek için veritabanının başlatılması gerekmektedir.
python manage.py makemigrations python manage.py migrate
Veritabanı senkronizasyonu, yönetici arayüzünün çalışması için gerekli olan veritabanı türüne bağlı olarak gerekli tabloları veya koleksiyonları oluşturacaktır. Yönetici işlemleri için süper kullanıcınız yoksa, bir tane oluşturmanız istenecektir.
Zaten bir süper kullanıcınız varsa veya bilgilerini unuttuysanız, aşağıdaki kodu kullanarak yeni bir kullanıcı oluşturabilirsiniz.
python manage.py createsuperuser
Yönetici Arayüzünü başlatmak için, yönetici arayüzümüz için bir URL yapılandırılması gerekmektedir. “proje_adı/url.py” dosyasında şu yönlendirme bulunması gerekmektedir:
Kod (proje_adı/urls.py):
from django.urls import include, path from django.contrib import admin urlpatterns = [ path(r'^admin/', admin.site.urls), ]
Tüm kontroller yapıldıktan sonra, şu komut ile sunucu başlatılabilir:
python manage.py runserver