8 Eylül 2019 Pazar

Flask + MongoDB - Basit Bir Uygulama

Bu yazıda Flask uygulamamızda NoSQL veritabanı olan MongoDB'yi kullanacağız. Şimdiden iyi okumalar :+)



Flask Nedir ?

Flask python programlama dilinde web uygulama yazabilmemiz için oluşturulmuş bir micro frameworktür. Kendine ait bir veritabanı sistemi ya da bir dosya sistemi yoktur. Flask ile çok hızlı bir şekilde bir web uygulaması çıkarılabilir, genelde api yazmak için kullanılır. 

Şuraya bir hello world bırakalım. Ne kadar basit olduğunu siz de görebilirsiniz. 



Toplasak 10 satırı geçmez, oldukça basit. 

MongoDB Nedir ?

MongoDB NoSQL bir veritabanıdır. 10'dan fazla dile desteği vardır. Veritabanı döküman ve koleksiyonlardan oluşmaktadır. NoSQL demişken döküman tabanlı NoSQL bir veritabanıdır desek daha doğru olur. Dökümanların her biri aslında birer JSON nesnesidir. En güzel yanı insert edilen datanın SQL'deki gibi bir şemaya bağlı olmamasıdır aslında. Bir koleksiyon var o koleksiyona boş, dolu, fazla, dökümanı istediğin gibi insert edebiliyorsun ve uygulaman patlamıyor. Harika bir şey bu :+)



Yukarıdaki görüntüde users koleksiyonunun içerisindeki dökümanları görüyorsunuz. Bu dökümanların içerisindeki her bir alana field deniliyor. 

Buraya kadar basit bir anlatım yaptık, konu daha çok uygulama üzerine olduğu için MongoDB ve Flask hakkında daha fazla yazmaya gerek yok.

Uygulama Zamanı

Yukarıdaki kodlarımızın yeni hali şimdilik şöyle oldu: 


Açıklayıcı bir şekilde gidecek olursak. Import edilen request nesnesi bize gelen istekler hakkında bilgileri kullanmak için var, render_template methodu ise string olarak html döndürmeyelim hazır templatelerimiz olsun, bu templateleri render edip (içlerini doldurup) kullanıcıya öyle döndürmemiz için var. Flask template render etmede Jinja kullanmaktadır, template kısmında yazılacak kodları anlamak için Jinja'yı araştırabilirsiniz.

Routelarımıza bakacak olursak uygulamamız gayet basit bir create, get olayından oluşmakta. Methodlarımızın içi şimdilik boş. Ek olarak bir de templatelerimizin hangi dizinde olduğunu görmesi için template_folder belirttik. Sol tarafta proje dizinini görebilirsiniz. 

layer_business.py dosyasında asıl işi yapacak olan kodlar olacak, main.py dosyasında sadece veriyi alıp döndüreceğiz, layer_database.py kısmında da döküman modellerimiz olacak ve veritabanı ile alakalı kodlarımız. Bir nevi MVC modeli oluşturduk diyebiliriz. 


layer_database.py dosyamızdaki kodlarımız da böyle. Bu arada requirements.txt dosyasına pymongo modülünü de ekledik. Mongo'nun python için modülü. User dökümanı için bir sınıf oluşturdum fakat bu şart değil sadece koleksiyona insert ettiğimiz bir dökümanın fieldlarının neler olduğunu görmek için var. Tabi göstermelik değil kullanacağız da. 

Enviroments ile veritabanı bilgilerini alıyoruz, eğer verilmezse default olarak ikinci paremetredeki verileri kullanmakta. Burada dikkat edilmesi gereken en önemli detay connect=False parametresidir. Bu parametrenin default değeri True'dur ve sunucularda veritabanı bağlantısında sıkıntı çıkarmaktadır. Aslında uygulamanızı aç kapa yapınca bu durum oluşmakta. Şöyle de bir not var mongo dökümanında:


Veritabanı bağlantımızı yaptık, users koleksiyonumuzu oluşturduk fakat içine herhangi bir veri eklenmediği sürece koleksiyonu göremezsiniz. Bir veri eklediğinizde koleksiyon da otomatik olarak eğer yoksa oluşacaktır. Bu da ufak bir not olsun..

Birazcık kodladıktan sonra asıl işi yapan kodlarımızın hepsi böyle. 


Basit bir uygulama olduğu için form kontrolü için flaskte form oluşturmadık ya da kullanıcıları daha iyi bilgilendirmek için anlık bir info yapısı da kullanmadık. Flask ile bir web uygulaması yazmak isteyen arkadaşlar form kontrolü çok önemli WTForms modülünü araştırmanızı öneririm. Flask micro framework olduğu için bu tip şeyler içinde gelmiyor. Django gibi ya da daha farklı büyük web frameworklerinde bu tip form yapıları vardır. Form kontrolü çok önemli bir kıstastır. 

Aslında burada sıfırdan bakınca anlatılacak çok şey var gibi ama bunu anlatma niyetinde değilim çok uzar. Amacım MongoDB'yi Flask'e nasıl uygularız sorusuna basit bir cevap sunmaktı. 

Şöyle uygulama içi görüntüler aktaralım:

Register sayfası




Users Sayfası:


User Info Sayfası:



Robo 3T (MongoDB için güzel bir araç ) uygulamasından bir görüntü:



Basit bir yazı, basit bir uygulama yazalım dedik ama çok vakit aldı doğrusu bu kadar beklemiyordum ^^.

MongoDB'de query olaylarında çok güzel yapılar var ve bu queryler bir json aslında, karmaşık büyük query yazarken insan zevk alıyor. Yazımı baya eğlenceli, operatör olayları da baya özellik sunuyor, regex gibi. 

Belirtilmemiş ama karşılaştığım bir durum vardı. Belki de benim gözümden kaçtı ama görmedim doğrusu mongonun dökümanlarında. skip, limit ve sort operatörlerinin kendi arasında bir sırası olması lazımdı yanılmıyorsam. Önce sort, sonra limit, sonra da skip operatörünü kullanınca sorgu düzgün çalışıyordu eğer yanlış hatırlamıyorsam.. 

MongoDB'de veriler için şema olmadığı için bir tek default gelen bir index'i var (_id), verileri SQL veritabanlarına göre çok hızlı insert etmekte. 

Veriyi çekerken SQL veritabanlarına göre daha yavaş haliyle, bu yüzden dökümanların boyutları ne kadar büyük olursa sorgularda bir o kadar optimizasyona gidilmesi gerekiyor. Özellikle en önemli kıstas kesinlikle yapılmalı; eğer kullanılmayacak bir field varsa kesinlikle bu fieldı sorguda belirtmek gerekir. Performans için çok önemli. SQL'deki select column kullanımı gibi.

Dilerseniz istediğinz bir fieldı indexleyebiliyorsunuz. Daha sonra bu fieldın indexisini de silebilirsiniz. Indexlenen field üzerinden yapılan sorgular çok hızlı olmakta. Fakat ne kadar index sayısı artarsa insert ederken bir o kadar hız kaybı olacaktır. Değer mi değmez mi deneyip görülebilir. İndexleme yapılınca disk üzerinde tutulan yerin boyutu biraz artacaktır.



Esen kalın :+)

0 yorum:

Yorum Gönder