জ্যাঙ্গো কাস্টম ম্যানেজমেন্ট কমান্ড

Image courtesy: Udemy

জ্যাঙ্গো ফ্রেমওয়ার্কে অনেকসময় ছ‌োটখাট কাজের জন্য স্ক্রিপ্ট লিখতে হয়। যেমন ধরা যাক আমরা একটা অ্যাপ বানাচ্ছি যেখানে বিভিন্ন টাইপ এর কিছু প্রবলেম আছে। প্রত্যেক ইউজার সেগুলো সলভ্ করার জন্য টাইপ এর ওপর ভিত্তি করে পয়েন্ট পায়। এখন আমরা হঠৎ করে সিদ্ধান্ত নিলাম যে একটা নির্দিষ্ট টাইপের প্রবলেমের জন্য পয়েন্ট বেশি করে দিতে হবে। তাহলে এখন যেসব ইউজার ঐ টাইপের প্রবলেম অলরেডি সলভ্ করেছে তাদের সবার টোটাল পয়েন্ট আপডেট করতে হবে। সেটা কিভাবে করা যায়? এটা আমরা একটা স্ক্রিপ্ট লিখে করতে পারি। স্ক্রিপ্ট থেকে আমাদের মডেল এবং সেগুলার ম্যানেজার অর্থাৎ ডাটাবেজ এক্সেস করার জন্য আগে যা করতাম তা হল DJANGO_SETTINGS_MODULE ইনভাইরনমেন্ট ভ্যারিয়েবল সেট করে, জ্যাঙ্গো সেটআপ করে বাকি কাজ করতাম।

আগে যা করতাম

কিন্তু আজ আবিষ্কার করলাম এই ধরণের ম্যানেজমেন্ট স্ক্রিপ্ট লেখার আরো ক্লিন এবং স্টান্ডার্ড একটা উপায় আছে। তা হল কাস্টম ম্যানেজমেন্ট কমান্ড। কাস্টম ম্যানেজমেন্ট কমান্ডগুলা manage.py দিয়ে রান করা যায়। জ্যাঙ্গো সেটআপ করার ঝামেলা নেই। কাস্টম ম্যানেজমেন্ট কমান্ড লেখার জন্য আমাদের অ্যাপ ডাইরেক্টরিতে management নামে একটি ডারেক্টরি বানাতে হবে। তার ভিতরে __init__.py নামে একটি খালি ফাইল রাখতে হবে যাবে পুরো ডাইরেক্টরিটি মডিউল হিসেবে গণ্য হয়। তার ভিতরে commands নামে একটি ডাইরেক্টরি বানাতে হবে। ঐখানেও __init__.py নামে একটি খালি ফাইল রাখতে হবে। commands ডাইরেক্টরিতে যেসব মডিউল থাকবে (কোন ফাইলের নাম যদি _ দিয়ে শুরু হয় তাহলে সেগুলা ইগনোর হবে) সেগুলো কমান্ড হিসেবে গণ্য হবে এবং manage.py‍ দিয়ে এক্সিকিউট করা যাবে। তাহলে ডাইরেক্টরিগুলো দেখতে এমন হবে

myapp/
__init__.py
models.py
management/
__init__.py
commands/
__init__.py
update_points.py
tests.py
views.py

এখন update_points.py এ আমাদের django.core.management.base‍ এর BaseCommand ক্লাস এক্সটেন্ড করে Command নামে একটি ক্লাস বানাতে হবে এবং ক্লাসে handle নামে একটি মেথড ইমপ্লিমেন্ট করতে হবে। আমরা যখন manage.py update_points দিয়ে আমাদের কমান্ড এক্সিকিউট করব তখন handle মেথডটি রান হবে।

খেয়াল করুন একটি বোনাস সুবিধা হল আমরা self.style এর মাধ্যমে বিভিন্ন স্টাইলে টার্মিনালে লগ প্রিন্ট করতে পারব। যেমন SUCCESS স্টাইলে লেখাগুলো সবুজ রং এর হবে। এখন আমরা এটিকে এভাবে এক্সিকিউট করতে পারি

./manage.py update_points

ম্যানেজমেন্ট কমান্ডে আর্গুমেন্ট পাস করার সুবিধা আছে। যেমন আমরা চাইলে একটি -s (silent) আর্গুমেন্টের মাধ্যমে বলে দিতে পারি যে আপডেটের করার সময় নতুন স্কোরগুলা প্রিন্ট করতে হবে না। এজন্য add_arguments মেথড ইম্প্লিমেন্ট করতে হবে।

এখন আমরা এটিকে এভাবে এক্সিকিউট করতে পারি।

./manage.py updater_points -s

এখন লগ প্রিন্ট হবে না। আর্গুমেন্ট পার্সার নিয়ে বিস্তারিত এখানে দেখতে পারেন।

আর ম্যানেজমেন্ট কমান্ডের বিস্তারিত এখানে দেখতে পারেন।

আর্গুমেন্ট পার্সার নিয়ে বিস্তারিত এখানে দেখতে পারেন।

পড়ার জন্য ধন্যবাদ। আমার প্রথম মিডিয়াম আর্টিকেল। ফিডব্যাক পেলে ভাল লাগবে।

--

--

সহজ বাংলায় প্রোগ্রামিং জ্ঞান ছড়িয়ে দেয়ার প্রত্যয়ে

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store