Django REST Framework → জ্যাঙ্গো রেস্ট এপিআই
strongly recommended: ব্লগটি পড়া শেষ করে অবশ্যই অবশ্যই django rest framework এর অফিসিয়াল ডকুমেন্টেশন অন্তত একবার হলেও পড়তে হবে ।
এই ব্লগের রিপজিটরি এখানে
Content
- section →1 ( basic API, End Point, Status code, Request method)
- section →2 ( Serializer, ModelSerializer, function based API, class based API, Validation)
- section →3
- section →4
Section → 1
- APIs, JSON, Endpoints
- REST, HTTP, Status Codes
- The Requests Module
- Our First Django APi pt. 1
- Our First Django APi pt. 2
APIs, JSON, Endpoints
api এর থ্রু তে ডাটা ট্রান্সফার হওয়ার খুব কমন একটি ফরম্যাট হচ্ছে JSON format
JSON → Javascript Object Notation
Endpoints সাধারণত URL এ ব্যাবহার করা হয় ।
Endpoint ব্যাবহার করে আমরা api এক্সেস করতে পারি । কোন ইনফরমেশন অথবা সার্ভিস api এর মাধ্যমে ব্যাবহার করতে চাইলে URL patterns ব্যাবহার করতে হয় ।
REST, HTTP, Status Codes
REST → REpresentational State Transfer
api REST হতে গেলে নিচের কতোগুলো শর্ত ফিলাপ করতে হয় ।
Status codes
The Requests Module
python ব্যাবহার করে কিভাবে ম্যানুয়ালি রিকোয়েস্ট করা যায় সেটা এখন দেখব ।
সেজন্য আমাদের প্রথমে ভার্চুয়াল ইনভাইরনমেন্ট ক্রিয়েট করে সেখানে request মডিউল ইন্সটল করতে হবে ।
install venv
sudo apt install python3-venv
এরপর নিচের কমান্ড গুলো চালাতে হবে ।
python3 -m venv env
source ./env/bin/activate
pip install requests
virtual environment এ python 3 ইন্সটল থাকলে সেক্ষেত্রে শুধু pip ইউজ করলেই python 3 প্যাকেজ কাজ করবে অন্যথায় pip3 ইউজ করতে হবে ।
এখন ফাইলটা রান করলে যদি status code 200 দেয় তাহলে রিকোয়েস্ট সাকসেস ।
এখন requirement ফাইল ক্রিয়েট করলে সেখানে আমাদের ইন্সটল প্যাকেজ গুলা দেখা যাবে এবং সেগুলোর ভার্সন ও দেখা যাবে ।
pip freeze > requirements.txt
এরপর আবার যখন নতুন কোন প্যাকেজ ইন্সটল করবো এরপর পুনরায় উপড়ের এই requirements কমান্ড চালালে আপডেট হয়ে যাবে ।
এভাবে রিকোয়েস্ট করে বিভিন্ন ধরনের ইনফরমেশন দেখা যায় ।
desable python lynter → ctrl + shift + p
এটা প্রেস করে pylinter off করে দিতে হবে ।
github এর প্রথম প্রজেক্ট level_0 তে বেসিক endpoint এবং backend থেকে frontend এ জেসন ডাটা ম্যানুয়ালি পাঠানো হয়েছে ।
section → 2
- Serializers
- ModelSerializer ( without using Django rest framework )
- Function based view ( @api_view Decorator )
- Class based view ( extends API view class )
- Serializers Validation
- ModelSerializer Class
- Nested Relationship
এই প্রজেক্টের জন্য প্রয়োজনীয় প্যাকেজ সেটআপ করে নেই ।
virtualenv env
source ./env/bin/activatepip install django
pip install djangorestframework
pip freeze > requirements.txt
cat requirements.txt --> এই কমান্ড দিয়ে কি কি প্যাকেজ ইন্সটল আছে সেটা দেখা যায়
এখন প্রজেক্ট সেটআপ করে নেই
django-admin startproject newsapi
installed apps এ djangorestframewok লিস্টে দিয়ে দেওয়ার জন্য rest_framework
এভাবে দিতে হবে ।
নতুন একটি app ক্রিয়েট করার জন্য এই কমান্ড দিতে হয়
python manage.py startapp news
visual code এডিটরে প্রজেক্ট রান করার জন্য এর launch.json ফাইলে manage.py ফাইলের ডিরেক্টরি জেসন ফাইলে দিয়ে দিতে হবে run and debug সেকশনে যেয়ে ।
"program": "${workspaceFolder}/newsapi/manage.py"
এখন নিচের এই গিটহাবের ( github )লিঙ্কে api এর সকল কোড আছে ।
গিটহাবে আপ করার সময় .gitignore ফাইল ক্রিয়েট করবো কারণ আমরা সকল ফাইল গিটে আপ করতে চাচ্ছি না যেমন virtualenv, django, djangorestapi ইত্যাদি প্যাকেজগুলো গিটে আপ করতে চাচ্ছি না । সেজন্য এই সাইটে যেয়ে django সিলেক্ট করে প্রয়োজনীয় কোড .gitignore ফাইলে পেস্ট করবো । এরপর venv নামটা এর ফাইলের শেষে দিয়ে দিবো কারণ virtualenv ডিরেক্টরির কোন কিছু আমরা ইনক্লুড করতে চাচ্ছি না ।
Serialization
ডাটাবেজ থেকে কোয়েরি করে ডাটা এনে সেটাকে পাইথন ডাটা টাইপে কনভার্ট করে পরে সেটাকে জেসন ফরম্যাটে কনভার্ট করার প্রসেস কে বলে serialization যাতে করে api এর থ্রু তে ডাটা ট্রান্সফার করা যায় ।
django তে সাধারণত ২ টা ক্লাস ব্যাবহার করা হয় →
- Serializer
- ModelSerializer
serialization এর বিপরীত প্রসেসকে বলে deserialization. deserialization এর মাধ্যমে ফ্রন্টেন্ডের ডাটাকে বেকেন্ডে প্রসেস করে ডাটাবেজে অপারেশন চালানো হয় ।
এখন ২ টা ক্লাস নিয়ে আলোচনা করা হবে ।
- Parsers
- Renderers
api এর কাজ করার জন্য বেস্ট প্র্যাকটিস হচ্ছে যে অ্যাপ এ কাজ করবো সেই অ্যাপ ডিরেক্টরির আণ্ডারে api নামে ডিরেক্টরি ক্রিয়েট করে নিবো ।
Forms, ModelForms যেমন একটি আরেকটির সর্টফর্ম তেমনি Serializer, ModelSerializer এর কাজ অনেকটা একি ।
প্রথমে একটি মডেল তৈরি করি
এরপর ঐ মডেলের একটি serializer ক্লাস তৈরি করি
serializer ক্লাস বানানো হয়ে গেলে django shell ওপেন করি নতুন টার্মিনালে
python manage.py shell
এখানে serialize.data তে পাইথন ডিকশনারি রিটার্ন করবে ।
ModelSerializer
serializer এর কাজ গুল সর্ট কাটে করার জন্য ModelSerializer ব্যাবহার করা হয় ।
serializer.py file :
Create API without using Django rest framework
django rest framework ব্যাবহার না করেই api তৈরি করা যায় । এটা নিচে দেখানো হলও
Function based API view (Using api_view() Decorator )
views.py file
urls.py file
Class based API view
views.py file
urls.py file
Generic views & Mixins
অনেক সর্ট কাটে API তৈরি করার জন্য Generic views and Mixins ব্যাবহার করা যায় । ফাংশন বেজ/ ক্লাসবেজ API view এ create, post, update, delete এর জন্য আলাদা আলাদা কোড লিখতে হয় কিন্তু এখানে আলাদা ভাবে লেখার দরকার হয় না সুধু নিচের এই ক্লাস গুলো এক্সটেন্ড করলেই হয়ে যায় ।
বিভিন্ন ধরনের mixins আছে এরমদ্ধে আছে ...
- CreateModelMixin
- RetrieveModelMixin
- UpdateModelMixin
- DestroyModelMixin
আর URL এ নিচের এক লাইনের কোড টুকু দিলেই হয়ে যাবে ।
path('generic/article/', GenericAPIView.as_view()),
Authentication
৩ ধরনের authentication আছে ...
- BasicAuthentication
- TokenAuthentication → client server সেটআপের জন্য সাধারণত ব্যাবহার করা হয় । যেমন — mobile application, desktop application
- SessionAuthentication → ajax request . নরমাল জেঙ্গ backend এপ্লিকেশনের জন্য ব্যাবহার করা হয় ।
BasicAuthentication
2 ভাবে ইন্টেগ্রেট করা যায় ।
প্রথমে গ্লোবালি এক্সেস পাওয়ার জন্য settings.py ফাইলে নিচের কোড গুলো দিয়ে দিতে হবে
অথবা যে ক্লাসে লাগবে সেই ক্লাসে নিচের কোডগুলো import করে নিতে হবে ।
class base api এর জন্য Authentication সিস্টেম আলাদা আবার function base Authentication সিস্টেম আলাদা ।
Class level Authentication
function base authentication
এ সবগুলোই django rest framework এর অফিসিয়াল ডকুমেন্টেশন এ আছে । গুগল এ সার্চ দিয়ে documentation টা দেখে নিলে ভাল হবে ।
Token Authentication
token authentication এর জন্য নিচের লাইন গুলো settings.py ফাইলের installed apps সেকশনে দিয়ে দিতে হবে ।
INSTALLED_APPS = [
...
'rest_framework.authtoken'
]
এরপর python manage.py migrate
কমান্ডটি চলাতে হবে ডাটাবেজ আপডেটের জন্য । এরপর সেখানে নতুন একটি টোকেন তৈরি করে নিতে হবে ।
Authorization: Token 9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b
এরপর যখন API এর মাদ্ধমে ডাটা দরকার হবে তখন এই টোকেনটি সাথে দিয়ে দিতে হবে । তাহলে ডাটা আসবে না হয় ডাটা আসবে না ।
যে ক্লাসে authentication এর কাজ করবো সেই ক্লাসের import section এ নিচের লাইনটি দিয়ে দিতে হবে ।
from rest_framework.authentication import TokenAuthentication..........authentication_classes = [TokenAuthentication]
normal রিকোয়েস্ট করলে হবে না এভাবে token টি দিয়ে দিতে হবে তাহলেই ডাটা আসবে ।
Viewsets and Routers
এটাতে get/post মেথড allow করে না । এর পরিবর্তে এটা list,create, delete, update প্রভাইড করে ।