Web uygulamaları geliştirirken kimi zaman API gibi bir harici kaynaktan veri alıp kullanmanız söz konusuyken çoğu zaman kendi oluşturduğunuz kaynaklardan veri yazıp okumanız gerekecektir. Küçük boyutlu veriler ile çalışıyorsanız bu kaynak bir dosya olabileceği gibi, büyük projelerde genellikle MySQL, PostgreSQL gibi bir veritabanı olacaktır. Flask ile bu veritabanları ile bağlantı kurarak kullanıcıdan aldığınız verileri veritabanına kaydedebilir, gerektiğinde veri çekerek uygulamanızda kullanabilirsiniz.

Web uygulamalarında en popüler olarak kullanılan veritabanı olan MySQL ile nasıl çalışabileceğimize göz atalım. Öncelikle MySQL sunucusunun topluluk tarafından geliştirilen ücretsiz sürümünü bu adresten indirip kurulumunu gerçekleştirmelisiniz. Daha sonra çalıştırıp temel ayarlarını yapmalısınız. Bununla ilgili dokümantasyona göz atarak bu işlemleri tamamlayabilirsiniz. Ya da Xampp projesi gibi web geliştirme ortamı ihtiyacını toplu olarak gidermenizi sağlayan, Apache web sunucusunun ve MariaDB(Bir MySQL klonu) veritabanı sunucusunun kurulumunu birlikte gerçekleştiren birleşik kurulum paketleri kullanabilirsiniz.

Ben linux üzerinde geliştirme yapıyorum ve aynı zamanda web geliştirme ortamının en meşhur üçlüsü olan Apache-MySQL-PHP ile de geliştirme yaptığım için Xampp ile Apache-Mariadb-PHP-phpMyAdmin toplu kurulum paketini tercih etmiştim. Dolayısıyla config dosyalarının bulunamadığı hatasının çözümünü sizinle hemen paylaşabilirim. Flask MySQL modülünü kurmadan önce terminal penceresinde;

$  sudo apt-get install libmariadbclient-dev

Not: MySQL’i web sitesinden indirip kuranlar için kurulacak kütüphane; $ sudo apt-get install libmysqlclient-dev

komutunu vererek MariaDB veritabanı kullanıcı kütüphanesini yükleyip, daha sonra Flask MySQL modülünün kurulumuna geçmelisiniz. Aksi takdirde, MySQL sunucunuzu çalıştığınız cihaza kurup çalıştırmadıysanız hata alacaksınızdır. Ya da, standart konumdan farklı bir yere kurulum gerçekleştirdiyseniz veritabanı ayar dosyalarını bulamadığı ile ilgili de hata alırsınız.

/bin/sh: 1: mysql_config: not found
/bin/sh: 1: mariadb_config: not found
/bin/sh: 1: mysql_config: not found

Şimdi, tüm kurulumları başarıyla tamamladığınızı ve geliştirme cihazınızda MySQL çalıştırıp kullanabildiğinizi düşünüyor ve Flask ile MySQL’i birlikte kullanabilmemizi sağlayan modülü kurmaya geçiyorum. Terminal penceresinde;

$ pip install flask-mysqldb

komutunu vererek kurulum yapalım.

Successfully installed flask-mysqldb-0.2.0 mysqlclient-2.0.3

mesajı ile kurulumun başarıyla tamamlandığı bilgisini alıyoruz.

Artık Python kodlarımız içinde MySQL kullanmak için dosyamıza ekleyebiliriz;

from flask_mysqldb import MySQL

Ancak Python dosyası içinde üzerinde çalışacağımız veritabanı henüz mevcut değil. Öyleyse hemen bir veritabanı ve içinde web sitemize gelen kullanıcıların kayıtlarını tutacak bir tablo oluşturalım.

Bu işlemler için terminal penceresinde MySQL komutları ve SQL dili ile her türlü işlemi gerçekleştirebileceğiniz gibi, eğer bunlara çok hakim değilseniz ya da daha kullanışlı bir çözüm arıyorsanız size yardımcı olabilecek bir takım yardımcı uygulamalar da mevcut. Bunlardan biri web geliştirme ortamlarında sıkça kullanılan aynı zamanda hosting paketlerinde standart haline gelmiş olan ve kendisi de bir web uygulaması olduğu için web tarayıcı üzerinden kullanılabilen phpMyAdmin, bir diğeri ise MySQL tarafından geliştirilmiş olan masaüstü uygulaması MySQL Workbench‘tir.

Eğer Xampp kurulumu ile çalışıyorsanız phpMyAdmin hazır kurulu geldiği için, http://localhost/phpmyadmin/ adresinden ulaşarak kullanabilirsiniz. Web sunucular üzerinde de çok fazla kullanıldığı için örneklerimizde de bu aracı kullanarak yeni adım atan geliştirici adayı arkadaşlarımızın aşina olmasını sağlayalım. Ancak birinin mantığını kavradığınızda her iki aracı da kolayca keşfederek sorunsuz kullanabilirsiniz.

7- Veritabanı ile Çalışmak 1

Web tarayıcımızda phpMyAdmin uygulamasını açıyoruz ve sol tarafta veritabanlarının listelendiği alanda en üstte yer alan “Yeni” bağlantısına tıklıyoruz.

Sağ tarafta açılan sayfanın içinde “Veritabanı Oluştur” başlığı altında yeni veritabanına vereceğimiz ismi ve Karşılaştırma açılır menüsünde de depolanacak verinin karakter kodlaması formatını belirliyoruz. Türkçe karakterler ile sorunsuz çalışabilmek için burada utf8_general_ci seçmemiz önemlidir.

Son olarak “Oluştur” butonuna tıklamamız yeni veritabanımızın oluşturulması için yeterlidir.

7- Veritabanı ile Çalışmak 2

Yeni veritabanı oluşturulur oluşturulmaz seçili hale geliyor ve sayfanın sağ tarafında karşımıza işlemler yapabileceğimiz tablar geliyor. İlk tab “Yapı” ismini taşıyor ve henüz veritabanımızda tablo bulunmadığı ile ilgili bir mesaj görüntüleyerek, hemen altında yer alan “Tablo oluştur” başlıklı alana yönlendiriyor. Burada üzerinde çalışacağımız verileri depolayacak olan tablomuza bir isim verip, “Sütun sayısı” veri giriş alanına bu tabloda tutacağımız verilerin kaç başlık altında olacağını giriyoruz. Veritabanı tablosundaki sütunlar genellikle gönderilecek veriler kadar sütunun yanısıra diğer tablolar ile ilişkilendirilmesini sağlayabilecek olan bir anahtar değeri depolayan sütunu içerirler.

Biz örneğimizde web sitemize gelen kullanıcıların bilgilerini depolayacağımız için; adı-soyadı, kullanıcı adı, şifresi, email adresi gibi her web sitesine üyelik esnasında kullanıcıdan alınan standart bilgiler yer alsın. Anahtar değer olarak da Kullanıcı No sütunu oluşturalım ve bu veri otomatik olarak oluşturulsun.

7- Veritabanı ile Çalışmak 3

Şimdi de “Git” butonuna tıklayarak, kullanıcılar tablomuz içinde depolanacak verilerin yerleştirileceği başlıkları yani biraz önce belirlediğimiz sütunları oluşturalım.

7- Veritabanı ile Çalışmak 4

Burada, Adı alanına Türkçe karakter girmemeye özen gösterin. Genel olarak ben ilk kelimesi küçük harfle başlayan ikinci kelimesinin ilk harfi büyük olan yazım standardını benimsiyor ve kodlarken kolaylık olması bakımından yine anlamlı Türkçe isimlendirmeye özen gösteriyorum. Çoğu geliştirici arkadaşımız burada ve pek çok yerde genel alışkanlıkları takip edip İngilizce kelimeler kullanmayı tercih ediyorlar ancak ben Türkçe isimlendirmeleri ister veritabanında ister kodlarken değişken adlarında daha anlamlı ve anlaşılır buluyorum. Kişisel tercihim denilebilir. Bildiğiniz gibi kodlarken kullandığımız dile özgü anahtar kelimeler zaten İngilizce, tanımlanan veri yapılarının, fonksiyonların, sınıfların da İngilizce olması biraz daha iç içe geçmiş görünüyor. Ama dilin kendi kelimeleri dışındakileri Türkçe kullanınca, kodunuzu okuyan kişi “bunu kodlayan tanımlamış, bu dilin kendisinden ya da modülün kendisinden gelmiş” ayrımını daha kolay yapabiliyor. Siz istediğiniz tercihi yapabilirsiniz. Tabii yabancı geliştiricilerin de bulunduğu bir projede çalışıyorsanız ya da kodlarınızı açık kaynak kodlu olarak tüm dünyanın erişimine açacaksanız İngilizce isimlendirmeler tercih etmeniz daha mantıklı olacaktır.

İlk oluşturduğumuz sütun kullaniciNo daha önce de bahsettiğimiz gibi bu tabloyu diğer tablolar ile 7- Veritabanı ile Çalışmak 5ilişkilendirirken kullanacağımız benzersiz değerler bulunduran ve her kayıt oluşturulduğunda otomatik olarak tanımlanan bir veri depolayacak. Bu söylediklerimizi yapabilmesi için Index başlığından Primary tercih edip, A_I(Auto_Increment) alanını seçili hale getiriyoruz. Son olarak sağ alt kısımda bulunan “Kaydet” butonuna tıklayıp tablomuzu ve sütunlarını oluşturmuş oluyoruz.

Artık web sitemizi ziyaret eden kullanıcılarımızı kaydedeceğimiz veritabanımız hazır. Şimdi kod tarafına geçip Flask ile MySQL arasında bir bağlantı kurmamız gerekiyor. Bunun için Flask sınıfından oluşturduğumuz nesnemize konfigürasyon verileri ekliyoruz. Bunu daha önce “Konfigürasyon Dosyalarıyla Çalışmak” konumuzda öğrendiğimiz şekilde harici bir konfigürasyon dosyasında oluşturup projemiz içinde bu dosyadan okuyup kullanabiliriz ki genelde bu yöntem kullanılır. Ama şimdilik proje dosyamız içinde tanımlayalım;

from flask import Flask, render_template
from flask_mysqldb import MySQL

ilkproje = Flask(__name__)

ilkproje.config["MYSQL_HOST"] = "localhost"
ilkproje.config["MYSQL_DB"] = "fwg"
ilkproje.config["MYSQL_USER"] = "root"
ilkproje.config["MYSQL_PASSWORD"] = ""
ilkproje.config["MYSQL_CURSORCLASS"] = "DictCursor"

veritabaniBaglantisi = MySQL(ilkproje)

Burada öncelikle MySQL sunucumuzun bulunduğu konumu MYSQL_HOST olarak tanımlıyoruz. Bu bir web adresinde bulunan uzak sunucu da olabilir. Biz yerel olarak kurulu olan MySQL sunucusunu kullanmak için localhost olarak tanımlıyoruz. Daha sonra bu sunucuda kullanacağımız veritabanının adını belirliyoruz. Bu veritabanına bağlantı kurabilmek için gereken MySQL sunucusunda yetkilendirilmiş kullanıcı adı ve şifremizi belirtiyoruz. Xampp ile kurulu olan MySQL sunucusunu kullandığımız için en st düzey yetkilere sahip root kullanıcısı ile işlem gerçekleştiriyoruz ve üstelik şifresi boş. Tabii yerel cihazımızda geliştirme ortamında olduğumuz için bunu mazur görüyoruz ancak uygulamamızı yayınlamaya başladığımızda bundan daha büyük bir güvenlik açığı olamaz. Tabii yayınlama ortamında MySQL sunucusu buna zaten izin vermez. root yetkisini kullanamazsınız. Size ait bir kullanıcı adıve şifresiyle, sadece kendi oluşturduğunuz veritabanlarına bağlantı kurabilecek ve kullanabilecek yetkilerle çalışırsınız.

Buraya kadar olan ayarlar hemen hemen tüm web geliştirme dillerinde benzerdir. Ancak son ayarımız MYSQL_CURSORCLASS ve değeri DictCursor veritabanından alınacak verilerin formatını belirleyerek gelen veriler ile daha kolay çalışabileceğimiz sözlük formatında bize ulaşmasını sağlıyor.

Daha sonra da flask_mysqldb modülünün MySQL sınıfından veritabaniBaglantisi adını verdiğimiz nesnemizi oluşturuyor ve kullanılmaya elverişli hale getiriyoruz.

Artık bu nesneyi kullanarak veritabanımıza veri kaydedebilir ya da veritabanındaki verileri sorgulayıp alarak Python kodumuz içinde işleyip HTML şablonlarımızda görüntüleyebiliriz.