Gizli Verilerinizi Güvenle Saklamanın Yolu : “.env”
Eğitimlerde,konferanslarda sıkça karşılaştığım sorulardan biri projelerde kullandığımız hassas verileri nerede ve nasıl saklayacağımız konusu oluyor. API anahtarları, gizli erişim bilgileri veya sunucu yapılandırmaları gibi verilerin güvenli bir şekilde saklanması oldukça önemli. Çünkü bu verileri doğru bir şekilde saklamazsak ve Github repository özelinde bu hassas veriler gönderilirse sıkıntılar oluşabilir. Herhangi bir yöntem kullanmadan bu hassas verileri, ilgili .py
dosyalarına doğrudan eklemek de mümkün, ancak bu yöntem profesyonel bir çözüm olarak kabul edilmiyor ve yaygın olarak tercih edilen bir yöntem değil diyebiliriz.
Bu yazıda, .env dosyasının öneminden, nasıl oluşturulacağından ve nasıl kullanıldığından bahsedeceğiz. .env
dosyası, projelerde bu tür hassas bilgileri yönetmenin en güvenli ve düzenli yöntemlerinden biridir ve bu kullanımı hem örneklerle hem de en iyi uygulamalarla ele alacağız. Umuyorum ki yolu düşen herkese faydalı bir yazı olur. 🙂
Nelerden bahsedeceğiz?
- Peki .env dosyası nasıl oluşturulur?
- Python kodunda .env dosyasını kullanma(load_dotenv)
- Bonus: dotenv_values fonksiyonu
- Güvenlik için .gitignore kullanımını unutmayın!
Bir projede API anahtarları, gizli erişim bilgileri veya konfigürasyon ayarları gibi hassas bilgilerle çalışmak kaçınılmazdır. Ancak bu bilgileri doğrudan kodda yazmak güvenlik riskleri taşıdığı gibi, projeyi farklı ortamlarda kullanırken değişkenlik göstermesi de gereklidir. İşte burada .env dosyası devreye girer ve bu ihtiyaçları güvenli ve düzenli bir şekilde yönetmenize yardımcı olur.
Hemen gerçek hayattan bir örnek ile yola çıkalım. Açıkçası böyle olduğunda benim aklımda örnekler daha çok oturuyor. 🙂
Diyelim ki, bir sosyal medya analiz aracı geliştiriyorsunuz ve bu araç, Twitter API’si ile entegre çalışarak belirli anahtar kelimelerin analizini yapacak. Twitter API’sine erişmek için bir API anahtarına ihtiyacınız var, ancak bu anahtarı herkesle paylaşmak istemiyorsunuz. Ayrıca, projeyi yerel bilgisayarınızda çalıştırırken farklı bir API anahtarı kullanmak, projeyi sunucuya yüklediğinizde ise başka bir API anahtarını kullanmak istiyorsunuz. İşte .env dosyası
, bu tür durumlar için oldukça kullanışlıdır.
Peki .env Dosyası Nasıl Oluşturulur?
Projenizin ana klasöründe yeni bir dosya oluşturup, adını .env
olarak kaydedin. Bu dosya, proje çalıştırıldığında ihtiyaç duyulan gizli bilgilerinizi saklayacaktır. Aşağıdaki gibi örnek bir .env
dosyası oluşturalım. İçerisinde de Twitter Api Key ve Twitter Secret Key bulunduğunu varsayalım.
TWITTER_API_KEY="your-local-twitter-api-key"
TWITTER_API_SECRET="your-local-twitter-api-secret"
Python Kodunda .env Dosyasını Nasıl Kullanacağız?(load_dotenv)
Bu dosyadaki bilgilere Python kodunda erişmek için dotenv
kütüphanesini kullanabilirsiniz. dotenv
kütüphanesi, .env
dosyasındaki bilgileri yükleyerek Python projenizde kullanılabilir hale getirir.
pip install python-dotenv
Bu paketi yükledikten sonra ilgili Python kodunuzda load_dotenv()
fonksiyonunu çağırarak .env
dosyasını yükleyip içindeki bilgileri kullanabilirsiniz. Aslında bu fonksiyonu şöyle düşünebilirsiniz. load_dotenv()
fonksiyonu sayesinde proje içerisindeki .env dosyalarını aratmış ve eğer varsa bulup içerisindeki bilgilere ulaşmış olursunuz. .env
dosyasını load_dotenv()
ile yükledikten sonra os kütüphanesi ile birlikte os.getenv()
fonksiyonunu kullanarak bu dosyadaki değişkenleri okuyabilirsiniz.
from dotenv import load_dotenv
import os
load_dotenv()
api_key = os.getenv("TWITTER_API_KEY")
api_secret = os.getenv("TWITTER_API_SECRET")
Bu şekilde, .env
dosyasındaki bilgileri güvenli ve düzenli bir şekilde projeye dahil etmiş oldunuz. Bu sayede projeyi yerel bilgisayarınızda çalıştırırken kendi API anahtarınızı kullanabilir, projeyi sunucuya yüklediğinizde ise sunucuya özel bir API anahtarını kullanabilirsiniz. Bu da projenizi daha esnek ve güvenli hale getirir.
Bonus: dotenv_values Fonksiyonu
dotenv_values()
fonksiyonu, .env
dosyasındaki tüm değişkenleri alıp bir sözlük (dictionary) olarak döndürür. Yani, .env
dosyasındaki her anahtar-değer çiftini kolayca kullanabileceğiniz bir sözlük formatına sokar. Bu fonksiyon, verileri doğrudan os.getenv()
gibi bir fonksiyonla değil, bir sözlükle almayı tercih edenler için kullanışlı olabilir. Bu fonksiyon genellikle doğrudan .env
dosyasındaki verileri projenizde bir değişken olarak almak yerine, tüm veriyi bir arada görüp üzerinde işlem yapma ihtiyacı duyduğunda kullanılır.
Diyelim ki .env
dosyanız şu şekilde:
TWITTER_API_KEY=abc123
TWITTER_API_SECRET=secret987
DATABASE_URL=localhost:5432
Ve siz dotenv_values()
kullanarak bu verileri almak isterseniz şöyle bir şey yapabilirsiniz:
from dotenv import dotenv_values
# .env dosyasındaki anahtar-değer çiftlerini bir sözlük olarak alır
config = dotenv_values(".env")
print(config)
# Çıktı:
# {
# "TWITTER_API_KEY": "abc123",
# "TWITTER_API_SECRET": "secret987",
# "DATABASE_URL": "localhost:5432"
# }
api_key = config["TWITTER_API_KEY"]
api_secret = config["TWITTER_API_SECRET"]
database_url = config["DATABASE_URL"]
Bu şekilde, .env
dosyasındaki verilerin tamamını bir sözlük olarak alıp kolayca kullanabiliyorsunuz. Bunu yapmanın avantajı, tüm konfigürasyonların bir arada olmasını sağlamaktır. Ancak, daha spesifik bir anahtara ihtiyacınız varsa, os.getenv()
hala çok daha yaygın ve uygun bir kullanım, onu da söylemiş olalım.:)
Güvenlik İçin .gitignore Kullanımını Unutmayın!
Projede .env
dosyasını kullandığınızda, bu dosyayı .gitignore
dosyasına eklemeyi unutmayın. Böylece .env
dosyanızın projeyle birlikte versiyon kontrol sistemine eklenmesini ve herkes tarafından erişilebilir olmasını önlemiş olursunuz.
Daha önce de bahsettiğimiz gibi, .env
dosyası genellikle API anahtarları, şifreler veya veritabanı bağlantı bilgileri gibi hassas verileri saklamak için kullanılır. Bu bilgiler, gizli oldukları için kesinlikle versiyon kontrolüne (Git) dahil edilmemelidir. Eğer .env
dosyasını Git’e eklersek, bu bilgiler istemeden herkese açılmış olur ve güvenlik açıklarına yol açabilir.
.venv
, ise bir proje için kurduğunuz sanallaştırılmış ortamdır (virtual environment). Python projelerinde, projeye özgü bağımlılıkları yönetmek için sanal ortam kullanmak yaygın bir uygulamadır. venv
dosyası, proje için gerekli olan tüm bağımlılıkları (kütüphaneler, modüller vb.) izler. Bu sanal ortam, proje dışındaki Python projelerinden bağımsız çalışır.
Ama .venv
klasörü, genellikle çok büyük bir dosya yapısına sahip olur ve başka bir geliştirici için tamamen gereksizdir, çünkü aynı bağımlılıkları onlar da kendi makinelerinde kurabilirler. Bu nedenle .venv
dosyasını da .gitignore dosyasına ekleyerek versiyon kontrolüne dahil etmemek en mantıklı olandır.
.env
.venv
Bu sayede, git commit
yaparken .env
dosyanız projeye dahil edilmez ve hassas bilgileriniz korunur. İşlem bu kadar basittir. 🙂
Sonuç itibariyle, proje geliştirme sürecinde güvenlik ve verimlilik her zaman ön planda olmalıdır. .env
dosyasının doğru kullanımı, hassas verileri güvenli bir şekilde saklamamıza olanak tanır, böylece API anahtarları, şifreler ve diğer gizli bilgiler yerel makinalarımızda korunur ve dışa sızmaz. Bunun yanı sıra, .venv
gibi sanal ortam dosyalarının versiyon kontrolüne dahil edilmemesi de projelerimizin daha verimli çalışmasını sağlar ve gereksiz dosya yükünden kurtulmamıza yardımcı olur.
Bu yazıyı okumadan önce bu konuyla ilgili kafanızda soru işaretleri varsa, umarım şimdi her şey daha net hale gelmiştir. 🙂
Farklı makalelerde görüşmek üzere,
Sevgiler