ইনস্টলেশন ধাপে আমরা দেখেছি ভার্সন নির্নয় করতে django-admin.py টুলটির ব্যবহার । এখন আমরা এই টুলটি ব্যবহার করবো নতুন একটি প্রজেক্ট তৈরি করতে । টার্মিনালে এই কমান্ডটি ব্যবহার করুন -
django-admin.py startproject mysite
এটা mysite
নামে একটা ডিরেক্টরী তৈরি করবে । চলুন দেখে নেই mysite
ডিরেক্টরীর স্ট্রাকচার কেমন হলো -
mysite/
manage.py
mysite/
__init__.py
settings.py
urls.py
wsgi.py
পুনশ্চ: আপনি যদি ভুলক্রমে জ্যাঙ্গোর অন্য কোন ভার্সন ইনস্টল করে থাকেন তবে এই স্ট্রাকচার ভিন্ন হতে পারে । যেহেতু এই বইটিতে আমরা এই স্ট্রাকচার অনুসরণ করবো তাই ভালো হয় এরকম স্ট্রাকচার তৈরি করলে ।
এবার আসুন এই ডিরেক্টরী এবং ফাইলগুলোর পরিচিতি জেনে নেই -
- একেবারে বাইরের
mysite
ডিরেক্টরীটি আসলে আমাদের মূল প্রজেক্ট ডিরেক্টরী । এটার নাম আসলে কোন ব্যাপার না । manage.py
: এটি হলো জ্যাঙ্গোর কমান্ড লাইন টুলগুলোর মধ্য একটি । এটি ব্যবহার করে আমরা প্রজেক্ট সম্পর্কিত নানাবিধ কাজ করতে পারি ।- ভিতরের
mysite
ডিরেক্টরিটাই আমাদের মূল অ্যাপ্লিকেশন যেটি কিনা আসলে একটি পাইথন প্যাকেজ যার ভিতরে আমাদের অ্যাপ্লিকেশনের মৌলিক কিছু কনফিগারেশন আমরা সংরক্ষন করবো । -
mysite/__init__.py
: আমরা জানি__init__.py
সাধারণত একটি ফাকা ফাইল হয় যেটা নির্দেশ করে যে এই ডিরেক্টরিটি আসলে একটি পাইথন প্যাকেজ । সাধারণ ডিরেক্টরি এবং পাইথন প্যাকেজের পার্থক্য করার জন্য এটি বেশ কাজের । mysite/settings.py
: অ্যাপ্লিকেশনের সেটিংসগুলো এই ফাইলে রাখি আমরা ।-
mysite/urls.py
: এই ফাইলে থাকে এই অ্যাপ্লিকেশনের সকল URL এর সংজ্ঞা । এই ফাইলেই আমরা জ্যাঙ্গোকে বলে দেই কোন URL কিভাবে হ্যান্ডল করবো আমরা । mysite/wsgi.py
: এই ফাইলটি WSGI কম্প্যাটিবল সার্ভার ব্যবহার করার সময় কাজে লাগে । এই ফাইলের কেরামতি আমরা যখন ডেপ্লয়মেন্ট নিয়ে আলোচনা করবো তখন দেখবো ।
সবকিছু ঠিকঠাক আছে কিনা দেখার জন্য এবার আমরা ডেভ সার্ভার চালু করবো । জ্যাঙ্গো অ্যাপ ডেভেলপ করার জন্য এর সাথেই চমৎকার একটি সার্ভার দেওয়া থাকে । ফলে সহজেই আমরা অন্য কোন সার্ভারের প্রয়োজন ছাড়াই অ্যাপ্লিকেশনটি চালু করতে পারি এই সার্ভার দিয়ে । এটি চালু করতে কমান্ড দিন -
python manage.py runserver
আউটপুট হবে নিচের মত -
Validating models...
0 errors found
May 24, 2013 - 15:50:53
Django version 1.5, using settings 'mysite.settings'
Development server is running at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
আমরা যদি http://127.0.0.1:8000/
অ্যাড্রেসটি আমাদের ব্রাউজারে প্রবেশ করাই তবে আমরা জ্যাঙ্গোর হোম পেইজটি দেখতে পাবো ।
পুনশ্চ: আমরা চাইলে খুব সহজেই সার্ভারের পোর্ট বদল করতে পারি । যেমন আমরা যদি চাই সার্ভারটি 8080 পোর্টে রান করুক তবে আমরা runserver
কমান্ডটি ব্যবহার করবো সাথে অতিরিক্ত পোর্ট নাম্বারটি দিয়ে দিবো -
python manage.py runserver 8080
আমরা যদি mysite/settings.py
ফাইলটি টেক্সট এডিটরে খুলি তবে দেখবো ডাটাবেইজ এর জন্য একটি আলাদা সেকশন আছে ।
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
'NAME': '', # Or path to database file if using sqlite3.
# The following settings are not used with sqlite3:
'USER': '',
'PASSWORD': '',
'HOST': '', # Empty for localhost through domain sockets or '127.0.0.1' for localhost through TCP.
'PORT': '', # Set to empty string for default.
}
}
এখানে -
ENGINE
হলো ডাটাবেইজ ড্রাইভারের নাম ।NAME
হলো ডাটাবেইজের নাম । SQLite এর বেলায় ফাইলের নাম ।USER
ডাটাবেইজের ইউজার নেইম ।-
PASSWORD
হলো পাসওয়ার্ড । HOST
হচ্ছে ডাটাবেইজ সার্ভার যে হোস্টে রান করছে তার নাম । লোকাল মেশিনের হোস্টনেম হবেlocalhost
। উহ্য রাখলে জ্যাঙ্গো লোকালহোস্টই ব্যবহার করবে ।PORT
ডাটাবেইজ সার্ভার যে পোর্টে চালু আছে । সাধারণত এটির কোন মান দেওয়া লাগে না ।
আমরা একটি পূর্নাঙ্গ উদাহরণ দেখে নেই:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'student_database',
'USER': 'root',
'PASSWORD': 'Pa55w0Rd',
'HOST': '',
'PORT': '',
}
}
ধরে নিচ্ছি আমরা যে ডাটাবেইজ ইনফরমেশন দিয়েছি settings.py
এ তা সঠিক । এবার তাহলে ডাটাবেইজ সিঙ্ক্রোনাইজেশন এর পালা । একটি জ্যাঙ্গো সাইট বা প্রজেক্ট অনেকগুলো ছোট ছোট অ্যাপ্লিকেশনের সমন্বয়ে তৈরি হয় । এই অ্যাপ্লিকেশনগুলি settings.py
এর INSTALLED_APPS
সেকশনে যোগ করা হয় । বাই ডিফল্ট কতগুলো অ্যাপ্লিকেশন যোগ করাই থাকে এই লিস্টে । অনেক অ্যাপ্লিকেশনই ডাটাবেইজে তথ্য সংরক্ষন করে । তাই এদের প্রয়োজন পড়ে টেবিল তৈরি করার । manage.py
এর syncdb
কমান্ডটি এই কাজটিই করে দেয় আমাদের জন্য । আমরা টার্মিনালে রান করবো -
python manage.py syncdb
জ্যাঙ্গো একে একে সব গুলো অ্যাপ্লিকেশন এর জন্য টেবিল তৈরি করবে । এরপর একটি সুপারইউজার তৈরি করতে চাইবে । সম্মতি দিয়ে পছন্দমত ইউজারনেইম, ইমেইল অ্যাড্রেস এবং পাসওয়ার্ড দিয়ে তৈরি করে ফেলুন সুপারইউজারটি । পরে কাজে লাগবে । প্রসেসটি বেশ সিম্পল । স্ক্রীনের ইনস্ট্রাকশন ফলো করলেই কাজটি সম্পন্ন করতে পারবেন বেশ করে ।
পুনশ্চ: জ্যাঙ্গো শুধু মাত্র INSTALLED_APPS
তালিকায় থাকা অ্যাপ্লিকেশনগুলোর জন্যই টেবিল তৈরি করবে । যে সকল অ্যাপ্লিকেশন আপনার প্রয়োজন সেগুলো যোগ করে syncdb
চালান । তবে একবার টেবিল তৈরি করে পরে অ্যাপ্লিকেশন তালিকা থেকে রিমুভ করে দিলেও জ্যাঙ্গো ঐ টেবিল ডাটাবেইজ থেকে রিমুভ করবে না । যেসব অ্যাপ্লিকেশন আপনার দরকার পড়বে না সেগুলো syncdb
চালানোর আগেই এই তালিকা থেকে মুছে দেওয়া বা কমেন্ট আউট করাই শ্রেয় ।
আমরা শুরুতেই দেখেছি প্রজেক্ট তৈরি করা । এরপর syncdb
সেকশনে বলেছি একটি প্রজেক্ট হলো এক বা একাধিক অ্যাপ্লিকেশনের সমষ্টি । একটি জ্যাঙ্গো সাইট বা প্রজেক্ট এর ওভার অল ফাংশনালিটি আমরা ছোট ছোট ইউনিটে ভাগ করে ফেলি । এরপর প্রত্যেকটি ভিন্ন ভিন্ন ফিচারের জন্য আমরা আলাদা আলাদা অ্যাপ্লিকেশন ডেভেলপ করি । একটু ব্যখ্যা করি, ধরুন আপনি একটি কমিউনিটির জন্য সাইট ডেভেলপ করছেন । আপনার প্রয়োজন পড়বে -
- ব্লগ
- ফোরাম
- ফটো বা ভিডিও গ্যালারি
জ্যাঙ্গোতে আমরা প্রতে্যকটি ফাংশনের জন্য আলাদা আলাদা অ্যাপ্লিকেশন তৈরি করবো । এতে লাভ - একই ধরণের কাজ করে এমন সব কোড এক জায়গায় থাকছে, এই অ্যাপ্লিকেশনটি চাইলে আপনি অন্য আরেকটি প্রজেক্ট এও ব্যবহার করতে পারছেন খুব সহজে । জ্যাঙ্গোর অ্যাপ্লিকেশনগুলো অনেকটা প্লাগ অ্যান্ড প্লে ধাচেঁর । আপনি শুধু মূল অ্যাপ্লিকেশনের settings.py
এর INSTALLED_APPS
সেকশনে যোগ করে দিবেন, একবার syncdb
করবেন এবং তারপর urls.py
তে রাউট যোগ বা ইম্পোর্ট করবেন । ব্যাস, কাজ শেষ! এই ধরণের ফ্লেক্সিবিলিটির কারণে জ্যাঙ্গোতে কাজ করতে অনেক মজা এবং সময়ও কম লাগে । বিশাল কমিউনিটির সবাই মিলে এমন হাজার হাজার অ্যাপ্লিকেশন ডেভেলপ করে রেখেছে । আপনার যা প্রয়োজন, সেটি ইনস্টল করে নিন অথবা হালকা পরিবর্তন পরিবর্ধন করে নিজের মত করে ব্যবহার করুন ।
জ্যাঙ্গো শিখতে এবার আমরা নিজেরাই একটি অ্যাপ্লিকেশন তৈরি করবো । জ্যাঙ্গোর অফিশিয়াল টিউটোরিয়ালের সাথে মিল রেখে ওদের অ্যাপ্লিকেশনটিই তৈরি করবো আমরা । অ্যাপ্লিকেশনের কনসেপ্ট বেশ সহজ । একটা "পোল" অ্যাপ । অনলাইনে জমনত জরিপ করার জন্য বিভিন্ন দৈনিক পত্রিকাগুলো যেমনটি করে, ঠিক তেমন একটি অ্যাপ । এখানে কতগুলো প্রশ্ন থাকবে । প্রত্যেক প্রশ্নের কতগুলো নির্দিষ্ট উত্তর থাকবে । ভিজিটররা ইচ্ছামত ভোট দিতে পারবে ।
একটা অ্যাপ্লিকেশনের স্ট্রাকচার তৈরি করার জন্য manage.py
এর startapp
কমান্ডটি ব্যবহার করবো এভাবে -
python manage.py startapp polls
তাহলে আমাদের প্রজেক্ট রুটে আরেকটি ফোল্ডার (আসলে পাইথন প্যাকেজ) তৈরি হবে polls
নামে । এবার এটির স্ট্রাকচার দেখে নেই -
polls/
__init__.py
models.py
tests.py
views.py
এখানে -
__init__.py
নির্দেশ করে যে ডিরেক্টরীটি একটি পাইথন প্যাকেজmodels.py
এ আমরা আমাদের প্রয়োজনীয় ডাটা মডেল তৈরি করবোtests.py
এ আমরা ইউনিট টেস্টিং এর জন্য টেস্ট কেইসগুলো রাখবোviews.py
গতানুগতিক MVC ফ্রেমওয়ার্ক থেকে জ্যাঙ্গো একটু ভিন্ন । জ্যাঙ্গোতে Controller এর পরিবর্তে আমরা View ব্যবহার করি । এই ফাইলে আমরা সেই ভিউগুলো তৈরি করবো ।
MVC ফ্রেমওয়ার্কের কম্পোনেন্টগুলো হয় এমন -
Models
: ডাটা মডেলView
: ব্যবহারকারীরা যা দেখে । সাধারণত HTML, CSS, JS থাকে ।Controller
: বিজনেস লজিক থাকে । কন্ট্রোলার মডেল থেকে ডাটা নিয়ে ভিউ এর সাথে সমন্বয় করে ।
জ্যাঙ্গোতে আমরা MTV (Model, Template, View) প্যাটার্ন ফলো করবো । যদি MVC থেকে সরাসরি অনুবাদ করি তবে -
Model
এর জায়গায়Model
ই থাকছেView
এর কাজটা জ্যাঙ্গোতে করছেTemplate
Controller
এর জন্য আছেView
জ্যাঙ্গোর View
নিয়ে ইনশাআল্লাহ পরবর্তিতে আরো বিস্তারিত আলোচনা থাকবে ।
জ্যাঙ্গোর দর্শন হচ্ছে অ্যাপ্লিকেশনের ডাটা একটি সেন্ট্রাল মডেলে রাখা । এরপর প্রয়োজন মাফিক এই মডেলের উপর ভিত্তি করে অন্যান্য জিনিসগুলো অটোমেটিক্যালি জেনারেট করা । এই বিষয়ে আরো বিস্তারিত আমরা পরে দেখবো । আপাতত আমাদের ভোটিং অ্যাপ্লিকেশনের জন্য মডেল তৈরি করে নেই । আগেই বলেছি সব মডেল থাকবে অ্যাপ্লিকেশনের models.py
তে । সে হিসাবে আমরা polls/models.py
ফাইলটি খুলে নিচের কোড টাইপ করি -
from django.db import models
class Poll(models.Model):
question = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
class Choice(models.Model):
poll = models.ForeignKey(Poll)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
আপনি যেহেতু পাইথনের পূর্ব ধারণা রাখেন সেহেতু এই কোড বেশ সহজবোধ্যই মনে হবে । মূলকথা হলো জ্যাঙ্গোর একেকটি মডেল হলো একটি ক্লাস যা models.Model
ক্লাসের সাবক্লাস । মডেলগুলো ডাটাবেইজের টেবিলকে রিপ্রেজেন্ট করে । ক্লাসের ভ্যারিয়েবল টেবিলের ফিল্ড বা কলামকে নির্দেশ করে । এই ভ্যারিয়েবলগুলোর টাইপ নির্ধারণ করে টেবিলের কলাম বা ফিল্ডের ডাটা টাইপ কি হবে । এই উদাহরণে আমরা দেখলাম CharField
যেটা অল্পকিছু ক্যারেক্টার (কিংবা ছোট খাটো স্ট্রিং) ধারণ করে । IntegerField
ইন্টিজার (পূর্ন সংখ্যা) এবং DateTimeField
দিন তারিখের জন্য ব্যবহার করা হয় । এরকম অনেকগুলো ডিফল্ট ফিল্ড টাইপ জ্যাঙ্গোর models
মডিউলে পাওয়া যায় । তবে সবগুলো আমাদের আপাতত না জানলেও চলবে ।
মডেল তৈরি করেছি আমরা, এবার এটাকে বাস্তবে ব্যবহার করার পালা । মডেলটি ব্যবহার করতে প্রথমেই আমাদের প্রয়োজন হবে ডাটাবেইজ সিঙ্ক করা । এতে জ্যাঙ্গো আমাদের জন্য প্রয়োজনীয় টেবিল তৈরি করে দিবে । তবে ডাটাবেইজ সিঙ্ক করার জন্য প্রথমেই আমাদের এ্যাপটিকে settings.py
এর INSTALLED_APPS
এ যোগ করে নিতে হবে:
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
'polls',
)
এবার রান করুন -
python manage.py syncdb
মডেল এর বাস্তবিক ব্যবহার বোঝার জন্য আমরা ইন্টারএ্যাকটিভ শেল ব্যবহার করবো । পাইথনের ইন্টারএ্যাক্টিভ প্রম্পট এর মতই এটি জ্যাঙ্গো এপিআই ব্যবহার করার সুযোগ করে দেয় । এটি চালানোর জন্য আমরা এই কমান্ডটি ব্যবহার করবো -
python manage.py shell
যেই শেলটি চালু হবে সেটিতে আমরা কোড লাইন বাই লাইন কোড লিখে আউটপুট পরখ করবো -
প্রথমেই আমাদের মডেল ক্লাসটি ইম্পোর্ট করে নেই -
>>> from polls.models import Poll, Choice
পেতে চাই সবগুলি Poll -
>>> Poll.objects.all()
[]
কিন্তু আমরাতো কোন Poll যোগ করিনি এখনো তাই একটি ফাকা লিস্ট পেলাম ।
তাহলে তৈরি করি প্রথম Poll টি -
>>> from django.utils import timezone
>>> p = Poll(question="What's new?", pub_date=timezone.now())
>>> p.save()
জ্যাঙ্গো অবজেক্টটি ডাটাবেইজে সেইভ করবে । এবার দেখি অবজেক্টটির নানা এ্যাট্রিবিউটগুলো -
>>> p.id
1
>>> p.question
"What's new?"
>>> p.pub_date
datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=<UTC>)
এবার দেখি কিভাবে খুব সহজেই এটিকে পরিবর্তন করা যায় -
>>> p.question = "What's up?"
>>> p.save()
এবার আবার সবগুলো Poll অবজেক্ট এর তালিকাটি দেখে নেই -
>>> Poll.objects.all()
[<Poll: Poll object>]
এভাবেই আমরা খুব সহজে মডেল তৈরি এবং ব্যববহার করতে পারি । ভবিষ্যতে আমরা মডেলের উপর আরো বিস্তারিত দেখবো ।