Django এ্যাপ decouple করার উদ্দ্যেশ্য হলো আমাদের এ্যাপ্লিকেশনে এনভায়রনমেন্ট ভ্যারিয়েবল সেট করে দেয়া যাতে একই এ্যাপ্লিকেশন ভিন্ন ভিন্ন এনভায়রমেন্টে রান করতে পারে।

প্রাথমিক অবস্থায় এ্যাপ্লিকেশন কনফিগারেশন গুলো settings.py ফাইলে স্ট্যাটিক ভাবে লেখা থাকে। এতে করে ওই এ্যাপটি যারা রান করবে তাদের সবাইকে ওই কনফিগারেশন ফলো করতে হবে।

এটা অনেক সমস্যার একটি বিষয়। কারন একটি প্রোজেক্টের ডাটাবেজ কনফিগারেশনে কেউ হয়তো MySQL ব্যবহার করে, অন্যজন হয়তো SQLite বা PostgreSQL. কিন্তু আপনার settings.py ফাইলে যদি ডাটাবেজ কনফিগারেশন স্ট্যাটিক ভাবে বলা থাকে তাহলে অন্য কেউ ওই প্রজেক্টে নিজের ইচ্ছামতো ডাটাবেজ ব্যবহার করতে পারবে না।

আবার এমন হতে পারে, আপনি ডেভেলপমেন্টের সময় ডিবাগিং ম্যাসেজগুলো দেখতে চাচ্ছেন কিন্তু প্রোডাকশনে কোনো কোনো ডিবাগ ম্যাসেজ দেখাতে চাচ্ছেন না। একই এ্যাপ এই দুইরকম এনভায়রমনেন্টে রান করার জন্য এনভায়রমনেন্ট ভ্যারিয়েবল তাহলে অবশ্যই লাগবে।

Django তে এনভায়রনমেন্ট ভ্যারিয়েবল ব্যবহার করার জন্য আমরা python-decouple নামের একটি প্যাকেজ ব্যবহার করবো।

প্রথমেই এই প্যাকেজটি ইনস্টল করে নেই

pip install python-decouple

এরপর settings.py তে config অবজেক্টটি ইমপোর্ট করে নেই

from decouple import config

কনফিগারেশন গুলো ডায়নামিক করে নেই

SECRET_KEY = config('SECRET_KEY', default="supersecretkey")
DEBUG = config('DEBUG', default=False, cast=bool)
EMAIL_HOST = config('EMAIL_HOST', default='localhost')
EMAIL_PORT = config('EMAIL_PORT', default=25, cast=int)

settings.py ফাইলের কনফিগারেশনগুলো config নামক ফাংশন থেকে কল হবে। config ফাংশনটি আমাদের প্রোজেক্টের রুট ডিরেক্টরিতে .env নামক ফাইলটি খুজবে। সেই ফাইলে যদি প্রথম প্যারামিটারের ভ্যারিয়েবলটি পাওয়া যায় তাহলে সেটা ব্যবহার করবে। আর .env ফাইল অথবা ফাইলে প্রথম প্যারামিটারের ভ্যারিয়েবলটি না পাওয়া গেলে default ভ্যালু যেটা দেয়া আছে সেটা ব্যবহার করবে।

.env ফাইল থেকে লোড করা প্রতিটি ভ্যারিয়েবল স্ট্রিং অবস্থায় লোড হয়। কিন্তু অন্য কোনো ডাটা টাইপে কনভার্ট করা দরকার হলে (DEBUG, EMAIL_PORT, DB_PORT) আমরা cast নামক প্যারামিটারটি ব্যবহার করে থাকি।

ঊদাহরন .env ফাইলঃ

SECRET_KEY=q$3e$qgs$imuydt%-u39gwuicx2xu-6q-e3!jx(xdex1w4mi6+
DEBUG=True
DB_ENGINE=django.db.backends.mysql
DB_NAME=exampledb
DB_USER=root
DB_PASSWORD=
DB_HOST=127.0.0.1
DB_PORT=3306

settings.py ফাইলে যে ভ্যারিয়েবলগুলো ডায়নামিক করা হয়েছে

SECRET_KEY = config('SECRET_KEY', default='supersecretkey')
DEBUG = config('DEBUG', default=False, cast=bool)

DATABASES = {
    'default': {
        'ENGINE': config('DB_ENGINE', default='django.db.backends.sqlite3'),
        'NAME': config('DB_NAME', default=os.path.join(BASE_DIR, 'db.sqlite3')),
        'USER': config('DB_USER', default='root'),
        'PASSWORD': config('DB_PASSWORD', default=''),
        'HOST': config('DB_HOST', default='127.0.0.1'),
        'PORT': config('DB_PORT', default=3306, cast=int)
    }
}

EMAIL_HOST = config('EMAIL_HOST', default='emailhost')
EMAIL_PORT = config('EMAIL_PORT', default=587, cast=int)
EMAIL_HOST_USER = config('EMAIL_HOST_USER', default='hostuser')
EMAIL_HOST_PASSWORD = config('EMAIL_HOST_PASSWORD', default='hostpassword')
EMAIL_USE_TLS = config('EMAIL_USE_TLS', default=True)
EMAIL_USE_SSL = config('EMAIL_USE_SSL', default=False)

0 Comments

Leave a Reply

Your email address will not be published. Required fields are marked *