Tesekkurler. Bizde suan ki projemiz icin python kutuphanelerini incelerken Hugi degerlendirmistik fakat Gracefulu sectik. https://github.com/swistakm/graceful. APIyi suan arkadas onla yaziyor ve gayet performansindan memnunlar.

Tesekkurler. Bizde suan ki projemiz icin python kutuphanelerini incelerken Hugi degerlendirmistik fakat Gracefulu sectik. https://github.com/swistakm/graceful. APIyi suan arkadas onla yaziyor ve gayet performansindan memnunlar. İnceledim de çok fazla djangoya benziyor :D

Hug ve SQLAlchemy ile Basit API Yapımı Selam, Geçenlerde yazı yazdıktan sonra Mirat Can Bayrak dedi ki hug ile ilgili birşeyler yazsana. Meğer kendisi üşenmiş. Neyse hug'a gelelim. Google'da hug diye arattığınızda bulamayabilirsiniz. I need hug. Hug'a erişmek için: HUG Hug Nedir? Hug falcon altyapısını kullanan bir rest api frameworkü. Peki bize ne vaad ediyor bu hug? Grdüğünüz gibi kendisi falcon, pycnic den sonra 3. sırada gelmekte. Yani bize hız vaad etmektedir. Bundan sonra ki yazıda pycnic üzerine mi olsa acaba? Neden Hug? Normalde ben API veya Web Application yazacaksam genelde bunu Flask ile yazmaktayım. Çünkü Flask de djangoya nazaran daha zgürsünüz ve Django'nun o katı iskelet yapısı vs. yok. Peki Flask yerine neden hug? Vallahi onu bende bilmiyorum. Ama yazmak hoşuma cidden hoşuma gitti. Çünkü direkt olarak Cli toollar bile yazabiliyorsunuz. Ayrıca Flaskde ki gibi Flask = app gibi standart szdizimleri bulunmamakta. Hadi Başlayalım Peki ne yapacağız hug ile? Ben gerçekten blog scripti yazmak isterdim fakat gerek yurtdışına çıkmam gerek gevşekliğim sebebiyle geçen hafta açtığım repoya henüz yeni pushladım kodları. Gerisini siz düşünün. O yüzden bende basit bir Kitap-Yazar scripti yapmaya çalıştım. Evet başlayalım. ncelikle kodlara ulaşmak için Tıklayınız Iskelet Yapımız Main dosyamız main. py Modellerimizi yazdığımız bir dosya models. py Model Şemalarımızın bir dosyası schemas. py Burada genelde bütün kodlarımızı main. py içerisinde yazacağız. Models. py ve Schemas. py dosyalarımıza sadece 1 kere dokunacağız daha sonra sabit kalacaklar. Modellerimizi Oluşturalım Kitap-Yazar projemizde düşündüğümüzde ne gibi modellerimiz olur? Kitap Yazar Tabi siz bunları Tür, Yayıncı vs olarak çoğaltabilirsiniz. Amaç mantığı anlamak. Kodlara geçelim. import sqlalchemy as sa from sqlalchemy. ext. declarative import declarative_base from sqlalchemy. orm import scoped_session, sessionmaker, relationship, backref engine = sa. create_engine session = scoped_session(sessionmaker Base = declarative_base class Author : tablename = 'authors' id = sa. Column name = sa. Column def repr : return '<Author >'. format class Book : tablename = 'books' id = sa. Column title = sa. Column author_id = sa. Column(sa. Integer, sa. ForeignKey author = relationship("Author", backref=backref Base. metadata. create_all Modüllerimizi, fonksiyonlarını impor ettik bu kısmı hızlı geçiyorum. Şimdi burada engine değişkenine bizim hangi database'i kullanacağımızı belirtmemiz gerekmekte. Ben burada sqlite belirttim fakat sizler Postgresql gibi bir çok database belirtebilirsiniz. Onlarında connection_uri'leri genelde benzerdir. Mesela postgresql connection_uri: postgresql://username@password:db gibidir. session değişkenine orm için kullanacağımız bind'ı koyuyoruz. Neden byle yapıyoruz bilmiyorum benimde ezberimden gidiyor bu olay. Aynı şekilde base değişkenini de ezberden kullanıyorum. Author Modeli Burada bir class içerisinde Author modelimizi belirleyip buna argüman olarak Base değişkenini veriyoruz. Tablename isminden de anlaşılacağı gibi. id kısmında bunun bir Column olacağını ve Integer tipinde olacağını ve auto_increment olacağını sylüyoruz. name sütununda ise bunun bir string sütunu olacağını ve sınırsız oldugunu sylüyoruz. Buraya güvenlik için sa. String(50) yazabilirsiniz. Book Modeli Burada da yapı yine aynı şekilde fakat en aşağıda author değişkenini grmektesiniz. Burada database motorumuza bunun Foreign key olacağını yani ilişkisel olacağını sylüyoruz. Bu ilişkisini Author class'ı ile kuruyoruz. En aşağıda ise tablolarımızı oluşturuyoruz. Schema Dosyamız Burada asıl amacımız bu modeller çağrıldığında modellerin içinde ki tüm alanları şema olarak bize geri dndürmesidir. from marshmallow_sqlalchemy import ModelSchema from models import Author, Book class BookSchema : class Meta: model = Book class AuthorSchema : class Meta: model = Author Burada iki şemamıza da hangi modeli baz alacağını gsteriyoruz. Gelelim zurnanın zırt dediği yere. Main Dosyamız Hemen kodları yapıştırıp açıklamayı kodların üstünde yapacağım. #- - coding:utf-8 - - import sqlalchemy as sa from sqlalchemy. orm import sessionmaker from models import Author, Book, Base # Modellerimizi import ediyoruz. from schemas import AuthorSchema, BookSchema #Şemalarımızı import ediyoruz. import hug # Hug Olmazsa olmazımız from falcon import # Yıldız ile import etmeyin siz. HTTP Status Codelar için import ettim. engine = sa. create_engine # Database Engine belirttik. Base. metadata. bind = engine DBSession = sessionmaker session= DBSession @hug. get # /books/ adresine get isteği yapıldığında aşağısı çalışsın diyoruz. def getbooks : books = session. query . all # ORM olarak bütün Book tablosunu alıyoruz. bookschema = BookSchema # Buradan da Book şemamızı alıyoruz. data = bookschema. dump . data # Book şemamızı book tablosu ile bağdaştırıp dataları alıyoruz. response. status = HTTP_404 # 404 Dndürüyoruz. Açıklayacağım. return data #Datamızı Dndürüyoruz. @hug. post # /books/ adresine post isteği yapıldığında aşağısını çalıştır babuş. def addbooks : # body isteğin body'sini belirtir. authorid = body # body içerisinde ki author_id yi değişkene atadım. bookname = body # body içerisinde ki bookname'i değişkene atadım.try: bookname, authorid = bookname. decode , authorid. decode checkauthor = session. query . filter_by . first # gelen id'ye sahip yazar var mı kontrol ediyorum. print # kontrol için koydum. if checkauthor None: response. status = HTTP_404 # Eğer yazar yoksa 404 dndür diyorum. return HTTP_404 else: book = Book # ID'ye ait yazar var ise kitabı oluşturacak olan ORM'yi hazırlıyoruz. session. add # Bunu session değişkeni ile database e gnderiyoruz. session.commit # Database'e yazıyoruz. response. status = HTTP_200 #200 dndürüyoruz. return falcon. HTTP_200 # response body 200 dndürüyoruz. except TypeError: response. status = HTTP_404 return falcon. HTTP_404 @hug. post def addauthors : session. rollback author_name = body author = Author session. add session.commit response. status = HTTP_202 return falcon. HTTP_202 @hug. get def getauthors : authors = session. query . all authorschema = AuthorSchema data = authorschema. dumps . data return data Gerisini yazmadım zaten gerisi birbirini tekrar ediyor. Şimdi burada açıklamam gereken şey eğer aşağıda ki gibi yaparsanız. return HTTP_200 return olarak sayfa 200 dnecektir. Ayrıca response body olarak da 200 dnecektir. return HTTP_404 yaptığımızda ise response body olarak 404 dnecek fakat istek 200 dnecektir. Gerçekte byle birşey grürseniz ne olur? WTF bu developer kafayı yemiş dersiniz. İşte o yüzden bazı route'larda response. status olarak HTTP status code'unu değiştirdim ki yukarıda ki gibi bir durum olmasın diye. response. status = HTTP_404 # 404 Dndürüyoruz. Açıklayacağım. return data #Datamızı Dndürüyoruz. Bilerek gzünüze takılsın diye byle yazdım yani. Evet şimdi istek yapalım. Tataa direk olarak Şemalarımız sayesinde bize geri dnen veri JSON olarak geri dndü. İşin zetine gelirsek aslında yapacağınız uygulamalar bundan da farklı değil. Biraz daha database işlemleri karmaşıklaşıyor vs. vs Neyse basit bir şekilde API yapımı bu kadar. Teşekkürler okuduğunuz için. https://ka1nsha.github.io/hug-sqlalchemy-basit-api.html