জ্যাঙ্গো রেস্ট এপিআই সিরিজ(থার্ড পার্টি প্যাকেজ ছাড়া) পর্ব ২

Md Mahmudul Huq Topu
4 min readMay 9, 2020

--

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

আমাদের দুই ধরনের ইউআরএল প্যাটার্ন ছিল, একটা হচ্ছে http://localhost:8000/api/persons/ যেটা কমন প্যাটার্ণ যেখানে GET মেথডে হিট করলে সব ডাটা লিস্ট আকারে দেখাবে আর POST মেথডে হিট করে ডাটা ইনসার্ট করা যাবে। আর আরেকটি ইউআরএল প্যাটার্ন ছিল স্পেসিফিক অবজেক্ট নিয়ে কাজ করার জন্য যেমনঃ http://localhost:8000/api/persons/<value of id>/ যেখানে আমরা আমাদের সিংগেল অবজেক্ট এর ডিটেইল ডাটা পাবো আর আপডেট করতে পারব এবং চাইলে ডিলিট করতে পারব। এখন তাহলে বুঝা গেল আমাদের তৈরী সিস্টেমে প্রথম প্যাটার্নে যদি কেউ ডিলিট অপারেশন চালাতে চেষ্টা করে তাহলে তাকে একটা ইরর মেসেজ দেয়ার জন্য আমরা ListAPIView তে নিচের delete() মেথড এড করলাম।

এখানে, সবচেয়ে নিচে delete() মেথডে খেয়াল করলে দেখা যাবে, যদি কেউ ১ম প্যাটার্নে ডিলিট রিকোয়েস্ট চালায়, তবে তাকে একটা 403 Forbidden Status Code সহ একটা ইররর মেসেজ দেয়া হলো যেমনঃ

এখন আমাদের PostDetailAPIView নিয়ে কাজ করতে হবে। আমরা কয়েকটি মেথড এড করব যেমনঃ

def post(self, request, *args, **kwargs):
response = json.dumps({"message":"Not Allowed"})
return HttpResponse(
response,
content_type='application/json',
status=400
)

এই মেথডে কাজ হলো, এই ভিউ তে যাতে কেউ POST রিকোয়েস্ট দিয়ে ডাটা ক্রিয়েট করতে চেষ্টা করলে তাকে একটা ইরর মেসেজ দেয়া যায় যে, “Not Allowed”

এবার আমরা এই PostDetailAPIView ক্লাসে ডাটা এডিট/আপডেটের জন্য দুইটি মেথড এড করব যেমনঃ

তো এই put() মেথড দিয়ে আমরা ডাটা আপডেট করব। আর্গুমেন্ট হিসেবে অবশ্যই self, request (Form Data), id (স্পেসিফিক আইডির কোন ডাটা এডিট করার জন্য) কাজ করবে। প্রথমে self.get_object(id=id) দিয়ে চেক করা হবে আদৌ যে আইডির ইউআরএল প্যাটার্নে আছে সেটা কি এক্সিস্ট করে কিনা, না করলে ইরর দেখাবে।

এরপর self.check() মেথড দিয়ে যাচাই করা হবে যে এপিআই থেকে আসা জেসন ডাটা পার্স করা যাবে কিনা, অর্থাৎ যদি PARSE না করা যায় তবে আমরা কাজ করতে পারব না।

data = json.loads(obj.serialize()) দিয়ে প্রথমে ডাটাবেজে থাকা স্পেসিফিক আইডির অবজেক্টকে সিরিয়ালাইজ করা হলো, যাতে করে আমরা এপিআই থেকে আসা ডাটার সাথে ম্যাপ করতে পারি।

passed_data = json.loads(request.body) দিয়ে এপিআই থেকে আসা ডাটা parse করে নিলাম যাতে পাইথনের ব্যবহার উপযোগী করা যায়।

data = json.loads(obj.serialize())
passed_data = json.loads(request.body)
for key, value in passed_data.items():
data[key] = value
form = PersonModelForm(data, instance=obj)

এখানে, যেহেতু passed_data একটি পাইথন ডিকশনারি , তাই একে আমরা লুপের মাধ্যমে একে মূল অব্জেক্টের নির্দিষ্ট কি পজিশনে এস্যাইন করে দিলাম।
পরে, আমাদের মডেল ফর্ম PersonModelForm এ মূল অবজেক্ট/ইন্সট্যন্সের সাথে পাঠিয়ে দিলাম। এখন বাকী কাজ আগের মতোই যদি ফর্ম সাবমিশন ঠিক হয় তবে ডাটা আপডেট এন্ট্রি নিবে নাহলে ইরর দিবে।

Showing Error On updating With Invalid (JSON Parsing Error) Data
Object Not Found Error
Email is an unique field
Update Successful with 201 Status Code

এবার আমরা ডিলিট মেথড এই সেম ভিউতে এড করব।

এখানে, প্রথমেই চেক করা হবে, obj = self.get_object(id=id) দিয়ে যে ডিলিট করার জন্য অবজেক্ট আদৌ এক্সিস্ট করে কিনা। না পেলে 404 ইরর দেখাবে।

deleted = obj.delete() দিয়ে নির্দিষ্ট অবজেক্ট ডিলিট করা হয় আর রিটার্ন করে একটি টাপল। যেখানে দুইটি আইটেম থাকে। যেমনঃ

যেহেতু ভিউটি আমরা print(deleted) লাইনটি রেখেছি, তাহলে আমাদের কনসোলে নিচের টাপল দেখাবে।

তো প্রথম আইটেমটি দিয়ে বুঝায় কয়টি অবজেক্ট ডিলিট হয়েছে আর দ্বিতীয়টি একটি ডিকশনারি যেখানে কোন টাইপের অবজেক্ট আর কতটি ডিলিট হয়েছে বুঝায়।

if deleted[0] == 1: কন্ডিশনের মাধ্যমে আমরা ডিলিট সাকসেসফুল মেসেজ দিবে। আর যদি ইরর থাকে তাহলে ইরর রেসপন্স পাঠিয়ে দিবে।

আর যদি অবজেক্ট না পায় তবে ডিলিট করতে গেলে উপরের মতো ইরর দিবে।

সম্পূর্ণ কোডের জিস্ট পেতে এই লিংকে ক্লিক করুন।

তো আজ এই পর্যন্তই, পরবর্তী পর্বে আমরা দেখব, Django Rest Framework ব্যবহার করে সহজে কীভাবে এপিআই তৈরী করা যায়। এবং সিকিউরিটি ফিচার কীভাবে ইমপ্লিমেন্ট করা যায়।

Stay Home, Stay Safe ! Keep Learning and Share this article to motivate the authors ♥

--

--

Md Mahmudul Huq Topu
Md Mahmudul Huq Topu

Written by Md Mahmudul Huq Topu

I’m a Full Stack Software Engineer at Skill Jobs.Also do youtubing(Metacentric Bangladesh) since 2014.

No responses yet