Django’da ortam dosyalarını kullanmak

Güvenlik, bir yazılım projesine başladığınızda aklınızın bir köşesinde devamlı tutmanız gereken şeylerden biri. Özellikle de projenizi açık kaynak olarak Github ya da Gitlab gibi platformlarda insanlara sunuyorsanız. Farklı projelerin farklı güvenlik önlemleri olabilir ancak ben bu yazımda Django ile çalışanlar için proje geliştirmeye başlamadan hemen önce yapmanız gereken ilk adımı ele almak istiyorum : ortam belgelerini kullanmak.

Her projenin ihtiyaçları farklıdır. Bu yüzden her projeye ayrı bir sanal ortam yaratmak önemli. Böylece o proje için kullandığınız program versiyonlarını, kütüphaneleri, özelleştirmeleri ana sisteminizden ayırabilirsiniz. Bu size daha sonra projenizi Docker gibi araçlarla deploy etme aşamasında büyük kolaylık sağlayacak, versiyonlar ya da teknolojiler arası çakışmaları önleyecektir. Yazılma yeni başladıysanız, henüz öğrenme aşamasındaysanız ve projenizi herhangi bir yerde yayınlamayacaksanız bile bu pratiği erkenden kazanmanızı öneririm. Böylece ileride daha büyük projelerde kolaylıkla uygulayabilirsiniz. O halde projeden önce sanal ortamımızı kurarak başlayabiliriz. Ben bunun için virtualenvkütüphanesini kullanıyorum. Siz başka bir kütüphaneyi de kullanabilirsiniz. Eğer sisteminizde virtualenv kütüphanesi yoksa aşağıdaki komutla yükleyebilirsiniz.

pip3 install virtualenv

Projeniz için bir klasör oluşturun ve terminal ile bu klasörün içinde aşağıdaki komutu çalıştırarak sanal Python ortamınızı kurun. Ben sanal ortamımın adına myvenv dedim ancak siz istediğiniz ismi koyabilirsiniz.

virtualenv myvenv

Ortam hazırlandıktan sonra proje klasörünüzü kontrol ederseniz içerisinde sanal ortamınızın hazır olduğunu görebilirsiniz.

Şimdi de sanal ortamımızı aktif hale getirmeliyiz. Unutmayın sanal ortamınız sisteminizde siz açmadığınız sürece pasif haldedir. Bu yüzden projeniz üzerinde her çalıştığınızda aktifleştirmeniz ve çalışmanız bittikten sonra yeniden pasifleştirmeniz gerekir.

source myvenv/bin/activate

Artık projemize özel aktif bir Python sanal ortamımız var ve bu küçük sistem için ihtiyacımız olan şeyleri yükleyebiliriz. Bu bir Django projesi olduğuna göre öncelikle onu yüklemeliyiz.

pip install Django

Eğer projemizdeki sanal ortamın klasörünü tekrar kontrol edersek site-packages klasörüne Django’nun eklendiğini görebiliriz. Bu sanal ortamımızın düzgün çalıştığı ve Django’nun sorunsuz şekilde yüklendiğini gösterir.

Sırada bir Django projesi oluşturmak var. Ben projeye envsample adını verdim siz istediğiniz gibi değiştirebilirsiniz.

django-admin startproject envsample

Proje klasörümüze bir göz atarsak Django’nun projemizi oluşturduğunu görebiliriz.

Projenin sorunsuz şekilde başlatıldığını test etmek için Django sunucusunu çalıştıralım. Bunun için öncelikle terminalinizde envsample klasörünün içinde aşağıdaki komutu çalıştırmanız gerekiyor.

cd envsample
python manage.py runserver

Komutun ardından terminalde aşağıdaki gibi bir geribildirim ve tarayıcımızda http://127.0.0.1:8000/ açtığımızda ekran görüntüsünü görüyorsanız her şey yolunda demektir.

Watching for file changes with StatReloader
Performing system checks...
System check identified no issues (0 silenced).You have 18 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
February 14, 2021 - 13:20:01
Django version 3.1.6, using settings 'envsample.settings'
Starting development server at <http://127.0.0.1:8000/>
Quit the server with CONTROL-C.

Şimdi projemizin ayarlar scriptini açalım ve bir iki önemli detaya göz atalım. envsample/envsample/settings.pybelgesini açtığınızda aşağıdaki gibi SECRET_KET bölümünü göreceksiniz. Secret Key her proje için Django tarafından üretilen sadece o projeye özgü bir güvenlik anahtarıdır. Bu anahtarı Github'ta yayınlamak ya da deploy ederken bu şekilde açık halde kullanmak istemezsiniz çünkü bu projenizde ciddi bir güvenlik açığı oluşturur.

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'n9^y4)ui^w+aw_7-bm6add5re09_#7zn0m5gqy_(btd*w3^9#w'

Hemen her projenin bir de veritabanı vardır. Belgedeki DATABASES bölümüne bakarsanız Django'nun varsayılan veritabanı olarak SQLite kullandığını görebilirsiniz.

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}

SQLite sade ve basit bir veritabanıdır ve ufak projeler için, öğrenme aşaması için idealdir. Ancak biz verilerimizi Postgres gibi daha gelişmiş bir veritabanında tutmak istersek bu bölümü aşağıdaki gibi düzenlememiz gerekir.

DATABASES = {
"default": {
"ENGINE": "django.db.backends.postgresql_psycopg2",
"NAME": "testdb",
"USER": "testuser",
"PASSWORD": "1234",
"HOST": "localhost",
"PORT": "5432",
}
}

Ve diyelim ki projenizde bir email backend kurmanız gerekti. Bu durumda ayarlarınıza bir de email bilgileriniz aşağıdaki gibi eklenecek.

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = "examplemail@gmail.com"
EMAIL_HOST_PASSWORD = "123456"

Buradaki sorunu görebiliyor musunuz? Projeniz açık kaynak kodlu olarak geliştirebilirsiniz, Heroku ya da DigitalOcean gibi alanlarda deploy edebilirsiniz ancak veritabanınızın ve diğer size özel olan bilgilerinizin bu şekilde görünmesini, ulaşılabilmesini istemezsiniz. Bu yüzden bu bilgileri proje dışında bir yerden servis etmemiz gerekir. Bunu da ortam dosyaları ile yapabiliriz.

Ortam dosyalarının ne olduğunu, ne işe yaradıklarını anladığımıza göre bunları nasıl kullanacağımıza geçebiliriz. Ben ortam dosyaları oluşturmak için dotenv kütüphanesini kullanıyorum. Terminalinize dönün ve en son çalışır halde bıraktığımız Django sunucusunu CONTROL-C ya da COMMAND-C ile durdurun. Aşağıdaki komutu çalıştırarak dotenvkütüphanesini kurun.

pip install python-dotenv

Proje klasörünüze gidin ve settings.py ile aynı yerde .env adında bir belge oluşturun.

Bu belgenin içerisinde projemiz için hassas olan bilgileri tanımlayacağız. Az önceki örneklerden yola çıkarak bu proje için Django secret key, veritabanı yönetici bilgileri ve email kullanıcı bilgileri olacak. .env belgesinde bunları şu şekilde tanımlayabiliriz.

SECRET_KEY='n9^y4)ui^w+aw_7-bm6add5re09_#7zn0m5gqy_(btd*w3^9#w'
DB_NAME='testdb'
DB_USER='testuser'
DB_PASSWORD='1234'
EMAIL_USER = "examplemail@gmail.com"
EMAIL_PASSWORD = "123456"

Gördüğünüz gibi aslında yaptığımız şey kritik bilgileri birer değişken gibi tanımlamak. Şimdi Django ayarlarını yeniden düzenlememiz gerekiyor. Bunun için öncelikle settings.py belgesinin başında kullandığımız kütüphaneyi çağırmamız ve yükleme komutunu çalıştırmamız gerekiyor.

import os
from dotenv import load_dotenv
load_dotenv()

Ardından .env belgesi üzerinden gelecek bilgileri uygun yerlerde tanımlıyoruz. Burada temel prensip os.getenv("YOUR_ENV_VARIABLE") ile .env belgesindeki variableları içe aktarmak.

SECRET_KEY = os.getenv("SECRET_KEY")DATABASES = {
"default": {
"ENGINE": "django.db.backends.postgresql_psycopg2",
"NAME": os.getenv("DB_NAME"),
"USER": os.getenv("DB_USER"),
"PASSWORD": os.getenv("DB_PASSWORD"),
"HOST": "localhost",
"PORT": "5432",
}
}
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = os.getenv("EMAIL_USER")
EMAIL_HOST_PASSWORD = os.getenv("EMAIL_PASSWORD")

Projeniz artık daha güvenli. Projenizi açık kaynak olarak Github’a yüklerken .env dosyalarını yüklememeniz gerektiğini unutmayın. Bunun yerine aşağıdaki gibi ayrı bir .env_example belgesi oluşturabilir ve projenizi kullanacak kişilerin hangi bilgileri gireceğine dair bir format paylaşabilirsiniz.

SECRET_KEY='your_django_secret_key'
DB_NAME='your_database_name'
DB_USER='your_database_admin_user'
DB_PASSWORD='your_database_admin_password'
EMAIL_USER = "your_email_user"
EMAIL_PASSWORD = "your_email_password"

Bu yazıda anlatılan projenin kaynak kodlarını görmek isterseniz buradan inceleyebilirsiniz.

📜 kurmacakafa. fictionhead. blue 🎥 film. code. creative arts. 🎬 filmmaker. developer. entrepreneur. 📌 Parazit Film & Digital Workz. Kısa İyidir. Tabby Cat.

📜 kurmacakafa. fictionhead. blue 🎥 film. code. creative arts. 🎬 filmmaker. developer. entrepreneur. 📌 Parazit Film & Digital Workz. Kısa İyidir. Tabby Cat.