টপিকঃ বোতল ফ্রেমওয়ার্কে হাতেখড়ি
ভুমিকাঃ
অনেকদিন পর টপিক লিখতে বসলাম। বোতল ফ্রেমওয়ার্ক অর্থাৎ bottle.py হচ্ছে ওয়েব ডেভেলপিং এর জন্য পাইথন এ তৈরী একটি মাইক্রোফ্রেমওয়ার্ক।
নামে মাইক্রো হলেও কাজের দিক দিয়ে এটি বেশ ফিচারফুল, কোন এক্সারনাল ডিপেনডেন্সি ছাড়া শুধু মাত্র পাইথন বেস লাইব্রেরি দিয়েই চলতে সক্ষম এটি।
এর প্রধান ফিচারগুলোর কয়েকটি,
Routing: ডাইনামিং ইউআরএল সাপোর্ট সহ রিকোয়েস্ট ম্যাপিং
Templates: দ্রুত এবং পাইথনীয় বিল্টিন টেমপ্লেট এন্জিন এবং mako, jinja2,cheetah ইত্যাদি টেমপ্লেট সাপোর্ট।
Utilities: বিভিন্ন প্রয়োজনীয় কাজ যেমন form data, file uploads, cookies, headers ইত্যাদির জন্য টুলস
Server: ডেভলপমেন্ট করার জন্য বিল্টিন ওয়েব সার্ভার সহ প্রচলিত অন্যান্য সার্ভার সাপোর্ট।
ইন্সটলেশনঃ
সম্পুর্ন ফ্রেমওয়ার্কটি একটি ফাইলেই সীমাবদ্ধ হওয়ায় আপনি ইচ্ছা করলে শুধু bottle.py ফাইলটি আপনার প্রজেক্টে যুক্ত করেও ব্যবহার করতে পারেন, অথবা easy_install বা pip দিয়েও ইন্সটল করতে পারেন।
bottle.py ফাইলটি ডাউনলোড করতে পারেন এই লিংক থেকে।
easy_install বা pip দিয়ে ইন্সটল করতে নিচের যেকোন কমান্ড ব্যবহার করুন।
easy_install -U bottle
pip install bottle
ব্যবহারঃ
বোতল ফ্রেমওয়ার্ক ব্যবহার করা বেশ সোজা। আমাদের বিভিন্ন URL এর জন্য ফাংশন ম্যাপ করতে হবে। আসুন দেখি hello world কোড।
from bottle import get, run, post, template
@get('/')
def index():
return '<b>Hello World</b>!'
run(host='localhost', port=8080)
এখানে দেখুন, @get এবং @post এই দুইটি ডোকোরেটর আমরা ব্যবহার করব Route করার জন্য। @route ও @get এর সমতুল্য। এখানে HTTP GET রিকোয়েস্টের জন্য আমরা @get এবং POST রিকোয়েস্টের জন্য আমরা @post ব্যবহার করব।
এরপর দেখুন @get এর আর্গুমেন্ট, আর্গুমেন্ট হিসাবে আমাদের URL টি দিতে হবে। এখানে আমরা '/' অর্থাৎ রুট কে ম্যাপ করেছি।
ডোকোরেটরের পরে আমাদের ওই URL এর জন্য যে ফাংশন ম্যাপ করব সেটি লিখতে হবে। এখানে সেটি হচ্ছে index।
index ফাংশন থেকে আমরা একটি স্ট্রিং রিটার্ন করেছি। এটিই হচ্ছে রেসপন্স।
এরপর দেখুন run , run এর মাধ্যমে আমরা আমাদের ওয়েব অ্যাপটি রান করাবো, আর্গুমেন্টে হোস্ট এবং পোর্ট দেওয়া হয়েছে।
এবার ফাইলটি সেভ করে রান করুন। আউটপুট আসবে এরকম।
Bottle v0.12-dev server starting up (using WSGIRefServer())...
Listening on http://localhost:8080/
Hit Ctrl-C to quit.
এবার ব্রাউসারে http://localhost:8080/ গেলেই hello world দেখতে পাবেন।
বেসিকতো হলো, এবার আরেকটু ডিপে যাওয়া যাক।
from bottle import get, run, post, template
@get('/')
@get('/hello/:name')
def index(name='World'):
return template('<b>Hello {{name}}</b>!', name=name)
run(host='localhost', port=8080, debug=True)
এই কোডে দেখুন, আমরা দুইটি URL কে ম্যাপ করেছি একটি মাত্র ফাংশন এর সাথে। এভাবে আমরা যত ইচ্ছা URL কে একটাই ফাংশনের সাথে ম্যাপ করতে পারি।
২য় ডেকোরেটরটি লক্ষ্য করুন। এখানে /hello/:name কে ম্যাপ করা হয়েছে। এর অর্থ এটি ম্যাচ করবে /hello/sarim , /hello/gittu ইত্যাদি URL কে। এবং :name এর অর্থ হচ্ছে /hello/ এর পরের অংশটি name নামক ভ্যারিয়েবলের মাধ্যমে index ফাংশনে উপলব্ধ হবে।
এবার কোডটি রান করুন এবং নিচের লিংকগুলো ব্রাউজারে চেক করুন।
http://localhost:8080/
http://localhost:8080/hello/
http://localhost:8080/hello/sarim
প্রথম URL টি ম্যাচ করছে আমাদের প্রথম ডেকোরেটরের সাথে, কিন্ত এতে কোন name ভ্যারিয়েবল নেই তাই index ফাংশনের আর্গুমেন্টে দেওয়া name এর ডিফল্ট ভ্যালু 'World' ব্যবহৃত হচ্ছে। ৩য় URL ম্যাচ করছে আমাদের ২য় ডেকোরেটরের সাথে এবং URL এর শেষ অংশের sarim টি name হিসাবে ব্যবহৃত হচ্ছে।
এবার দেখুন সরাসরি স্ট্রিং রিটার্ন না করে রিটার্ন করা হয়েছে একটা টেম্পলেট। বোতলে ব্যবহৃত টেম্পলেটের সিংট্যাশ বেশ সহজ। আমরা {{ }} এর মধ্যে যেকোন ভ্যারিয়েবল বা অবজেক্ট কে আউটপুট দিতে পারি। template ফাংশন এর ২য় বা পরবর্তি আর্গুমেন্টে আমরা টেম্পলেটে ব্যবহৃত অবজেক্ট গুলিকে অ্যাসাইন করব।
শেষ লাইনে দেখুন debug=True যুক্ত করা হয়েছে, এটা ডেভেলপমেন্টের সময় এরর এর বিস্তারিত দেখিয়ে সাহায্য করে।
আজ আপাতত এ পর্যন্তই। তবে এই খাপছাড়া টিউটোরিয়ালটি আপনারা আসলেই পড়লেন কিনা
সেটা বোঝার জন্য একটি ছোট্ট কুইজ।
উপরের তিনটি URL এর ২য় URL এ কিন্তু ERROR 404 আসে। আপনার কাজ হচ্ছে ওটার আউটপুট Hello World! আনা, বলুন কি কিভাবে করা যাবে ?
সাড়া পেলে আগামী পর্বে অন্যান্য বিষয় নিয়ে আলোচনা করার ইচ্ছা জানিয়ে আজকের মত এখানেই বিদায়