İçeriğe geç

Flask + Vue.js + MongoDB ile Modern Web Uygulamaları Geliştirmek Bölüm-2-

Tekrar merhabalar. Kaldığımız yerden devam ediyoruz. Daha önceki bölüm veya bölümleri okumamış iseniz

  1. Bölüm1 (Geliştirme ortamının kurulması, basit API yazımı ve isteklerin yollanması.

2. bölümle devam edelim. Bu bölümde ilk olarak MongoDB’yi kuracak ve daha sonrasında Flask uygulamamızın

mongo ile konusmasını sağlayacak olan ayarlamaları yapacağız. Ayrıca nasıl env değişkenleri oluşturuabilir bunları nasıl dahil edebilir onun üstüne konuşacağız. Veritabanı ayarlarını yaptıktan sonra birkaç CRUD işlemi yapacak ve proje şemasını çıkartacağız. Hazırsanız başlayalım..

Bu linkteki adresten işletim sisteminize uygun olan kurulum sayfasına gidin ve kurulum adımlarını takip ederek kurulumu tamamlayın.

Daha sonra servisin yüklendiği ve doğru çalıştığından emin olmak için şu komutu çalıştırın. Burada active(running) kısmını görmeniz gerekmekte.

Eğer doğru çıktıyı alamıyorsanız şu komut ile mongo’yu tekrar çalıştırmayı deneyebilirsiniz.

Eğer hata oluşmuş ise kurulum aşamasındaki mongo dosya izinlerini gözden geçirin ve hata kodunu internette aramayı deneyin 🙂 Devam edelim.

Diyerek mongo shell’ine düşüp show dbs komutu ile var olan veritabanlarını görüntüleyebilirsiniz.


Mongo başarılı bir şekilde çalışıyor fakat şu haliyle Flask uygulamamız veri alıp,veri yazabilecek durumda değil. Bu yüzden bir adet Mongo Driver’ı yüklememiz ve uygulamamızı konfigüre etmemiz gerekmekte.

Direkt python mongo driver diye aratır iseniz bir çok farklı kütüphane ile karşılaşacaksınız hepsi iş görür mü evet fakat ben PyMongo’yu kullanacağım.

Sanal ortamın aktif olduğundan emin olduktan sonra driver’i yükleyelim.


Ortam değişkenleri oluşturmak ve uygulamamızı yapılandırmak için hazırız. İlk önce biraz üstüne konuşalım.

Ortam değişkenleri kısaca çalışan veya çalıştırılacak bir işlemin davranışlarını etkileyebilen veya konfigüre edebilen

oluşturulduğu ortam veya global sisteme etki eden değişkenlerdir. Örneğin:

böyle bir kullanım ile aktif olan terminal oturumunuza Flask uygulamanızın server.py olduğunu belirttik. Daha sonra flask run komutu ile uygulamamızı çalıştırabildik.  Yeterli bir örnek oldu sanırım.

Projemizde gerekli olan konfirügasyon değişkenlerini ise .env dosyalarında tutacağız. Böylece kullanılan geliştirme ortamından ve geliştiriciden izole bir proje ortaya çıkacak.

Uygulamamızı kullanmak isteyen biri bu dosyalarda ki değişiklikleri kendi ortamına göre yapacak ve bir yerde değişen veri projenin her yerine etki ederek kod tekrar etmekten bizi kurtaracak. Ayrıca web uygulamalarının genelinde secret_key dediğimiz değişkenler bulunur bunlar kayıt sırasında alınan parola değerinin şifrelenmesi veya sistemde kullanılmak üzere token oluşturulma algoritmanlarında doğrudan rol sahibidir. 3.parti birinin bu keyi bilmesi güvenlik zaafiyetidir. Veritabanı kullanıcıları,parolaları korunması gerektiğini düşündüğünüz her şeyi dahil edebilirsiniz. Devam edebiliriz. Önce yardımcı aracımızı yükleyelim.

Daha sonra proje dizininde .env dosyasını oluşturalım ve değişiklikleri yapalım.

.env(example)

Mongo hostunu, portunu ve keyi belirleyelim. Erişim için kullanıcı korumanız var ise onları da ekleyebilirsiniz.

Daha  sonra flask uygulamamızın konfigürasyonunu Python tarafında tutacak olan dosya ve sınıfımızı oluşturalım.

config.py

Sırasyla yüklediğimiz dotenv  ve kullanacağımız diğer sistem kütüphanelerini içeri aktarıyoruz. load_dotenv fonksiyonu ile bu dosyanın dizinindeki .env dosyasını ortam olarak kullanmasını söylüyoruz.

Daha sonra bir sınıf tanımlayıp değişkenler oluşturuyoruz ve os.environ.get ile bu değişkenleri eşitliyor ve bulamazsa or ile ataması gereken değeri söylüyoruz.

Flask uygulamasını konfigüre etmenin bir çok farklı yolu var fakat uygulama büyüdükçe kontrol etmesi en kolay olan yöntem bence bu. Ayrıca farklı ortamlar için (geliştirme,test,canlı) sizi kod tekrarından fazlasıyla kurtaracaktır. İsterseniz diğer yollara ve verilebilecek değişkenlere buradan bakabilirsiniz.

Ayarlamaları yaptık bunu Flask’e bildirmemiz gerekmekte.

Flask instance’nı oluşturduğumuz sınıftan konfigüre etmesini söylerek işlemi tamamlıyoruz.

İşlemleri test etmek içinse: Yapılandırma başarılı👍


Tamamsak veritabanı ayarlamalarını yaparak devam edelim.

Ne yaptığımız üzerine konusacak olursak burada bir adet MongoClient’ı tanımladık. Bizim veritabanı işlemlerimiz için istemci görevi görecek ve bağlantılarımızı yönetecek.

db değişkeni ilede o client üstünden bağlandığımız mongo serverinde hangi veritabanı ile çalışmak istediğimizi söyledik.

İlişkisel veritabanlarında verileri tablolar üzerinde tutarken Nosql veritabanlarında verileri collection larda tutmaktayız. Bu yüzden ekleme silme veya sorgu gibi işlemleri gerçekleştireceğimiz yer burası. Veritabanında spesifik bir tabloyla çalışırken yaptığımız gibi db üzerinden bir collection seçtik ve onunla çalışmak istediğimizi söyledik.


Devam edebiliriz.

Projemizin frontend dışında ana hatlarını belirlediğimize göre kodlayacağımız sistem üstüne konuşalım.

Kütüphane uygulaması.

Tanım: Kullanıcının kendi kütüphanesindeki kitapların genel durumlarını takip edebileceği bir web uygulaması.

Örneğin kullanıcı kitaplarının bilgilerini tutabilmeli, yeni kitap ekleyebilmeli, var olan bir kitabın bilgilerini veya okunma durumunu değiştirebilmeli, listeleme yapabilmeli vs vs.

Basit düşünülmüş olsa da geliştirilmeye çok açık bir proje olduğunu düşünüyorum. Fakat versiyon 1 de isterseniz kitapların isimlerini, yazarlarını, okunma durumlarını, kütüphaneye eklenme tarihlerini, yayın evlerini tutalım. Bu bize fazlasıyla farklı işlem türetebileceğimiz veri çeşitliliğini sağlayacaktır.

O zaman Postman’i hazır da bekleterek ilk post isteğimizi yazalım ve veritabanına dokunmaya çalışalım.

Kitap ekleme.

tapplication/routes.py

Adım adım gidelim.

  • request gövdesinde gelen json verisini get_json metodu ile sözlük tipine dönüştürüp data değişkenine atadık.
  • Daha sonra eğer bu verinin içinde name değişkeni yani kitap adı yok ise veritabanına dokunmadan isteği reddettik.
  • Json verisi olarak geçmedik fakat kitabın oluşturulma tarihini server tarafında etiketledik.
  • __init__py dosyasından veritabanı değişkenimizi aldık.(direkt collection_name’i de aktarabilirdik) Collection name’i tanımladık ve insert_one sayesinde veritabanına dokunduk. Ve işlenen verinin id’sini sakladık.
  • Mongo otomatik ID tanımlarken ObjectID’yi kullandığı için bunu direkt olarak JSON ile serialize edenemezsiniz, yani cevap olarak dönülemez. O yüzden id’yi string’ e çevirdik ve response gövdemize ekleyip kullanıcıya döndük. Çünkü bu unique olan anahtar ile dökümanlarımıza ulaşacağız. Aslında bu önerilen bir yöntem değil fakat ufak bir uygulamada iş görecektir.

Kitap görüntüleme, sorgulanan kitabın özelliklerini güncelleme, kitabı silme.

application/routes.py

  • Url’de bir book_id değişkeni tanımladık ve bunu fonksiyonumuzda karşıladık. Bunun oluşturduğumuz kitabın ObjectID‘si olduğunu biliyoruz.  Ve bu view’ın izin vereceği HTTP metodlarını bir listede topluyoruz.(default GET) Daha sonra gelen isteklere göre aksiyon alıyoruz.

GET.

_id ile sorgulama yaptık ve nesnenin bilgileri döndü.


PUT.

Kitabımı okudum ve durumunu güncellemek istiyorum. İşlemi gerçekleştirmek için ilk olarak gelen isteğin gövdesinde status’un varlığını kontrol ediyorum. Burada aslında tip kontrolü yapılarak daha da güvenlik sağlanabilir. Neyse, daha sonra halihazırda url’imde bulunan book_id ile sorgulama yapıyor ve mongo’nun $set komutu yardımıyla bulunan nesnede hangi niteliğin değişeceğini ve yeni değerinin ne olacağını söyleyip cevap dönüyoruz.


DELETE.

Bu kitabı kitaplığımdan çıkartmak istiyorum. Dolayısı ile DEL metodu sayesinde server’a bu aksiyonu alması gerektiğini söylüyorum. book_id ile gerekli nesneyi buluyor ve siliyorum.


Her şey tamam görünüyor.

Son olarak

Bu bölüm ile birlikte backend kısmını neredeyse bitirdik. Artık

  1. Flask uygulamamız ile MongoDb’yi bağlayabiliyoruz.
  2. .env değişkenleri oluşturup daha sonra bu değişkenleri uygulama konfirügasyonumuzda kullanabiliyoruz.
  3.  GET,POST,PUT,DELETE  gibi HTTP metodlarında gereken aksiyonları alan ve cevap dönebilen view’lar yazabiliyoruz.
  4. ObjectID’lerin serialize edilemeyeceğini ve bunu uygulamalarımızda kullanacaksak bir gloabal JSON encoder yazmamız gerektiğini biliyoruz.. (Daha yazmadık ama yazacağız .. 🙂 )
  5. Yavaş yavaş Vue.js ile kodlamaya başlayayacağız. Yaklaşıyor yaklaşmakta olan 🙂

Ayrıca artık kodlara şu adresten ulaşabilir ve problem yaşadığınız kısımlarda direkt olarak yardım alabilirsiniz.

3.bölümde görüşmek üzere herkese selamlar 😎

 

 

 

 

Tarih:BlogFlaskPython

İlk Yorumu Siz Yapın

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Göster
Gizle