"Enter"a basıp içeriğe geçin

Flask Uygulamalarını Paylaşımlı Hosting Üzerinde Yayınlama

Bir önceki blog yazımda Flask uygulamalarını yayına alma yöntemlerinden bahsetmiş ve bu yöntemlerden birini detaylıca anlatmıştım. Meraklıları aşağıdaki linkten yazıya ulaşabilir, diğer yöntemleri ve bu yöntemlerin avantajlarını & dezavantajlarını görebilirler.

Bu blog yazısında ise diğer yöntemlere nazaran daha verimli ve ucuz bir yöntem olan paylaşımlı hosting yönteminden bahsedeceğim. Bu yöntem basit ve fazla gereksinimleri olmayan Flask uygulamalarını yayına almak için biçilmiş kaftandır. Ancak Redis, Elasticsearch, Celery gibi bağımlılıkları olan uygulamalarda pek işe yaramayacaktır.

Gereksinimler

Bu işlem için Python destekli paylaşımlı hosting hizmeti veren bir firma ile çalışmanız gerekiyor. Türkiye’de bu hizmeti veren benim bildiğim sadece Cenuta firması var. Siz yinede farklı firmaları araştırabilirsiniz.

Hizmet alacağınız firma, gereksinimlerinizi ne kadar karşılıyorsa sizin açınızdan o kadar iyi olur.

Flask uygulaması olarak ise, diğer blog yazılarında örnek olarak kullandığımız Confidant isimli günlük uygulamasını kullanacağız.

ServisAçıklamaUygulama
Paylaşımlı HostingPython desteği veren paylaşımlı hosting servisiCenuta
Flask UygulamasıYayına alacağımız Flask uygulamasıConfidant

Uygulama Oluşturma

Normal bir hosting alır gibi süreci yönettikten sonra firmanın bize verdiği yönetim paneline giriyoruz. Burada ihtiyacımız olan uygulamalar “Yazılım (Software)” kategorisindeki “Setup Python App” ve “Gelişmiş” kategorisindeki “Terminal” uygulamaları.

Python App ile Python uygulamalarımızı yönetirken, Terminal ile bazı küçük ayarları yapacağız.

Öncelikle “Setup Python App” uygulamasına giriş yapıyoruz. Bu uygulama aracılığı ile başta Flask olmak üzere bir çok Python destekli web servisini yayına alabiliriz.

Sağ üst kısımdaki “CREATE APPLİCATİON” butonuna tıklayarak ilk uygulamamızı oluşturuyoruz.

Karşımıza çıkan form bilgilerini, uygulamamızı referans alarak dolduruyoruz ve “Create” butonuna tıklıyoruz. Hangi alanın ne anlama geldiğini aşağıdaki tablodan takip edebilirsiniz. Değerler, Confidant uygulaması referans alınarak girilmiştir.

FieldAçıklamaÖrnek Değer
Python VersionFlask uygulamasının uyumlu olduğu Python versiyonunu belirtir.3.9.16
Application RootFlask uygulamasının, hosting üzerinde kurulacağı dizini belirtir.python_apps/confidant
Application URLUygulamanın URL’de hangi dizin ve domainde çalışacağını belirtir.confidant
Application Startup FileProje içerisinde, uygulama örneğinin bulunduğu dosyayı belirtir (wsgi.py, run.py vs).run.py
Application Entry PointApplication Startup File içerisinde uygulama örneğinin bulunduğu değişkeni belirtir.app

Versiyon olarak uygulamamı 3.10 versiyonunu baz alarak geliştirdim. 3.9 ile arasında ciddi farklar olmadığı ve en yüksek sürüm bu olduğu için bunu seçtim. Application Root olarak genel olarak hosting kök dizininde python_apps klasörünü kullandığım için bu klasörü verdim.

Startup File ve Entry Point ise en önemli değerler diyebilirim. Burada uygulama örneğinden kasıt, Flask uygulamasının işaret ettiği değişken. Bunun ne demek olduğunu bilmiyorsanız Flask Uygulamalarında Application Factory Pattern Kullanımı isimli blog yazımı okumanızı öneririm. Zaten örnek değere tıklarsanız bunun nereye tekabül ettiğini anlayabilirsiniz.

from app import create_app

app = create_app()  # Uygulamamızın örneğini burada oluşturduk.

if __name__ == '__main__':
    app.run()

Eğer Application Factory kullanıyorsanız create_app fonksiyonu ile uygulamayı oluşturup değişkeni Entry Point olarak verebilirsiniz. Kullanmıyorsanız uygulamanın olduğu dosyadaki app nesnesini işaret etmeniz yeterli.

Not: Hemen alt kısımda “Environment variables” kısmı dikkatinizi çekmiş olmalı. Bu kısma, yazının sonunda değineceğiz. Oldukça önemli bir detay çünkü.

Artık “Create” butonuna tıklayarak uygulamamızı oluşturabiliriz.

Gördüğünüz gibi uygulamamız oluştu. Yukarıda kırmızı alan içerisinde bize verdiği kodu kopyalıyoruz. Bu kod, uygulamamız için oluşturduğumuz sanal ortama bağlanmamıza ve proje dizinine giriş yapmamıza olanak sağlıyor. Kopyaladıktan sonra terminal uygulamasına geçiyoruz ve kopyaladığımız komutu buraya yapıştırarak işlemlere başlıyoruz.

Gördüğünüz gibi komutu girince ilgili klasöre (python_apps/confidant) ve sanal ortama bağlandı. Ben FTP kullanarak projemi ilgili dizine gönderdim, sizlerde isterseniz Git yada FTP kullanarak proje dosyalarınızı kaynak dizine gönderebilirsiniz.

Proje dosyalarınızı yükledikten sonra, PIP ile ilgili paketleri kurabilirsiniz artık. Normalde bunu Python APP Manager sayfasından yapmanız mümkün, ancak terminal kullanımını da görmenizi istedim.

~$ pip install -r requirements.txt
~$ flask db upgrade

Gerekli bağımlılıklarda kurulduktan sonra veritabanı geçişlerimizi 2. satırda uyguluyoruz. Burada SQLite veri tabanı kullandığımız için veri tabanı bilgisi vs girmemiz gerekmiyor. Eğer kuracağınız uygulamanın bazı ayarlarını girmeniz gerekiyorsa yazının devamındaki “Environment Variables” kısmına bakabilirsiniz. Yada kodu nano vb. bir program ile Manuel düzenlemeniz gerekiyor. Her şey tamamsa devam edelim.

Uygulama sayfasında “Restart” butonuna tıklayarak uygulamayı yeniden başlatabilirsiniz.

Yeniden başlatma sonrası, belirtilen URL adresine gittiğimizde uygulamamızın karşıladığını göreceksiniz.

Projemizi sorunsuz bir şekilde yayına almış olduk. Tebrikler!

Environment Variables

Dilimize “ortam değişkenleri” olarak geçen Environment Variables ifadesine Linux kullanıcılarının alışkın olduğunu düşünüyorum. Terminal üzerinde değişken ataması yöntemi ile bu ortam değişkenleri o anki oturuma kaydedilebilir ve bu değişken çeşitli yerlerde kullanılabiliriz.

Flask ile uygulama geliştirirken ayarların ortam değişkeninden alınmasını sağlayabiliriz keza Confidant uygulaması bu mantık ile geliştirildi. Kaynak kodlarda config.py dosyasını incelerseniz eğer (link) ayarlar oluşturulurken eğer get_env ile sistemden gelen bir değer yoksa varsayılan değeri kullan şeklinde bir geliştirme yapıldığını görebiliriz.

SECRET_KEY = getenv('SECRET_KEY') or urandom(24)
PORT = getenv('PORT') or 80

Örneğin burada SECRET_KEY değişkeni eğer ortam değişkenleri içerisinde varsa sistemden gelen değeri kullan, yoksa random oluştur demişiz. Bu yüzden uygulamamız yeniden başladığında her defasında oturumu baştan başlatmış olacak. Çünkü gizli anahtarımız her defasında rastgele oluşturuluyor ve oturum bilgileri ile bu gizli anahtar ile kaydediliyor.

Bu yüzden ortam değişkeni kullanmak istersen uygulama yönetim panelinin en altındaki “Environment Variables” kısmından ortam değişkenleri ekleyebiliriz.

Burada “Done” dedikten sonra uygulamamızı yeniden başlatırsak artık secret key olarak bizim verdiğimiz değeri kullanacak.

Bu sayede, veritabanı şifreleri vb gizli bilgileri kod içerisinde değilde ortam değişkeni şeklinde tutarak olası saldırılarda kendimizi güvence altına almış olacağız.

Tek Yorum

  1. Halil
    Halil 21 Mart 2024

    Hocam elinize emeğinize sağlık. Harika anlatmışsınız.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir