Django Web Framework
What is Django URLs
Django URLs হল Django তে তৈরী করা আপনার ওয়েব অ্যাপ্লিকেশনে একটি নির্দিষ্ট ভিউ ফাংশনে একটি নির্দিষ্ট URL pattern map করার একটি উপায়। যখন একজন ইউজার আপনার ওয়েব অ্যাপ্লিকেশন থেকে একটি নির্দিষ্ট URL এর requests করে, তখন Django আপনার প্রজেক্টের urls.py ফাইলে সংজ্ঞায়িত URL প্যাটার্ন ব্যবহার করে কোন view function request টি পরিচালনা করবে তা নির্ধারণ করতে।
জ্যাঙ্গোতে URL প্যাটার্নগুলি regular expressions বা regex ব্যবহার করে define করা হয়, যা আপনাকে একটি URL এ characters গুলোর একটি নির্দিষ্ট প্যাটার্নের সাথে মেলে। উদাহরণস্বরূপ, আপনি r’^articles/(?P
একবার আপনি আপনার URL প্যাটার্নগুলি ডিফাইন করলে, আপনাকে ডিফাইন করা URL গুলোকে view function গুলোর সাথে যুক্ত করতে হবে যা request গুলি পরিচালনা করবে। এটি সাধারণত আপনার project এর urls.py ফাইলের urlpatterns লিস্ট ব্যবহার করে করা হয়, যেখানে প্রতিটি URL প্যাটার্ন path() বা re_path() ফাংশন ব্যবহার করে একটি নির্দিষ্ট view function এ ম্যাপ করা হয়।
Basics of the Django URL Library
এখানে django.urls লাইব্রেরিতে, আমাদের বিভিন্ন ফাংশন রয়েছে যা আমরা আমাদের ওয়েব অ্যাপ্লিকেশনে ব্যবহার করব। আসুন তাদের সম্পর্কে আরও জানি:
1. path(route,view, **kwargs, name)
path() function হল একটি utility function যা জ্যাঙ্গো আপনার ওয়েব অ্যাপ্লিকেশনে ইউআরএল প্যাটার্ন নির্ধারণের জন্য প্রদান করে। এটি একটি URL patterns তৈরি করতে ব্যবহৃত হয় যা একটি নির্দিষ্ট URL এর সাথে মেলে এবং এটি একটি নির্দিষ্ট view function ম্যাপ করে।
route and view Argument
path() ফাংশন দুটি required arguments নেয়, তার মধ্যে প্রথম argument হল route যা একটি string যা URL pattern এর সাথে মেলে, এবং দ্বিতীয় argument হল view function যা request টি handle করবে।
উদাহরণস্বরূপ, এখানে একটি সাধারণ urlpatterns লিস্ট রয়েছে যা my_view নামক একটি ভিউ ফাংশনে একটি URL প্যাটার্ন ম্যাপ করে:
from django.urls import path from . import views urlpatterns = [ path('my-url/', views.my_view), ]
এই উদাহরণে, প্যাটার্ন /my-url/ এর সাথে মেলে এমন যেকোনো URL views.py ফাইলের my_view function দ্বারা handle হবে।
https://blog.w3programmers.com/trainings/python-beginning-to-advance/
**kwargs and name Optional Parameter
এছাড়াও django path ফাঙ্কশনে kwargs এবং name নামে optional parameter রয়েছে। এর মধ্যে name parameter দিয়ে URL pattern এর জন্য একটি unique name নির্দিষ্ট করতে ব্যবহৃত হয়, যা আপনার templates বা views গুলোতে URL গুলিকে reversing করার সময় ব্যবহার করা যেতে পারে।
এবার চলুন কিভাবে name parameter দিয়ে reversing করা যায় , তা কয়েকটা ধাপে দেখব:
১. প্রথমে, আপনার views.py ফাইলে একটি view function ডিফাইন করুন:
from django.http import HttpResponse def hello_world(request, name): return HttpResponse(f'Hello, {name}!')
এই উদাহরণে, hello_world view function একটি name parameter নেয় এবং একটি ব্যক্তিগত অভিবাদন সহ একটি HTTP response রিটার্ন করে।
২. এবার, আপনার urls.py ফাইলে একটি URL pattern ডিফাইন করুন যা আপনার hello_world view function এ ম্যাপ করে:
from django.urls import path from . import views urlpatterns = [ path('hello/<str:name>/', views.hello_world, name='hello_world'), ]
এই উদাহরণে, আমরা একটি URL pattern ডিফাইন করেছি যা /hello/john/ বা /hello/mary/ এর মতো URL এর সাথে মেলে। URL pattern এ একটি string parameter, name রয়েছে, যা hello_world ভিউ ফাংশনে পাঠানো হবে।
৩. এখন, আপনি আপনার কোডে hello_world ভিউ ফাংশনের জন্য একটি URL তৈরি করতে reverse() ফাংশন ব্যবহার করতে পারেন। উদাহরণস্বরূপ, আপনার কাছে একটি view ফাংশন থাকতে পারে যা ইউজারকে hello_world view ফাংশনে redirect করে:
from django.shortcuts import redirect from django.urls import reverse def redirect_to_hello_world(request): # Get the name from the request name = request.GET.get('name', 'World') # Generate the URL for the hello_world view url = reverse('hello_world', args=[name]) # Redirect the user to the hello_world view return redirect(url)
এই উদাহরণে, আমরা redirect_to_hello_world নামে একটি view ফাংশন ডিফাইন করেছি যা ইউজারকে hello_world ভিউ ফাংশনে redirect করে। আমরা hello_world view ফাংশনের জন্য URL তৈরি করতে reverse() ফাংশন ব্যবহার করি, args parameter ব্যবহার করে একটি positional argument হিসাবে name parameter পাস করি। তারপর আমরা ইউজারকে জেনারেট করা URL এ redirect করতে redirect () ফাংশন ব্যবহার করি।
এবার আপনার সুবিধার জন্য উক্ত view function এর জন্য নিচের মতো করে urlpattern টা ডিফাইন করে দিন :
from django.urls import path from . import views urlpatterns = [ path('hello/<str:name>/', views.hello_world, name='hello_world'), path('redirect/', views.redirect_to_hello_world, name='redirect'), ]
এখন ইউজার যখন localhost:8000/redirect/?name=Masud-এর মতো একটি URL ভিজিট করে, redirect_to_hello_world view ফাংশন reverse() ফাংশন ব্যবহার করে /hello/Masud/ এর মতো একটি URL তৈরি করবে এবং ইউজার কে সেই URL-এ redirect করবে। hello_world view ফাংশনটিকে “Masud” এ সেট করা নামের প্যারামিটারের সাথে ডাকা হবে এবং এটি ব্যক্তিগতকৃত অভিবাদন “Hello, Masud!” সহ একটি HTTP response প্রদান করবে।
এবার চলুন **kwargs আর্গুমেন্ট নিয়ে আলোচনা করা যাক:
Django এর path() ফাংশনে, kwargs আর্গুমেন্ট URL প্যাটার্নে অতিরিক্ত named parameters ক্যাপচার করতে ব্যবহৃত হয়। এটি আপনাকে আপনার URL প্যাটার্নে named parameters গুলিকে ডিফাইন করতে দেয় যেগুলি পজিশনাল নয়, যার অর্থ সেগুলি যে কোনও ক্রমে (order এ ) আপনার view function এ পাস করা যেতে পারে৷ এখানে একটি উদাহরণ:
from django.urls import path from . import views urlpatterns = [ path('books/<str:category>/', views.books_by_category, kwargs={'sort_by': 'title'}, name='books_by_category'), ]
এই উদাহরণে, আমরা একটি URL pattern ডিফাইন করেছি যা /books/fiction/ বা /books/nonfiction/-এর মতো URL-এর সাথে মেলে। URL pattern এ একটি string parameter, category, যা book_by_category view ফাংশনে পাঠানো হবে। আমরা {‘sort_by’: ‘title’} এর মান সহ একটি kwargs প্যারামিটারও অন্তর্ভুক্ত করেছি। এর মানে হল যে যখন একটি URL এই প্যাটার্নের সাথে মেলে, view function টি ‘title’ এর মান সহ একটি sort_by parameter পাবে।
আপনার view ফাংশনে আপনি কীভাবে kwargs parameter ব্যবহার করতে পারেন তা এখানে দেখানো হলো:
from django.urls import path from . import views # Sample data books = { 'fiction': [ {'title': 'To Kill a Mockingbird', 'author': 'Harper Lee'}, {'title': '1984', 'author': 'George Orwell'}, {'title': 'Pride and Prejudice', 'author': 'Jane Austen'} ], 'nonfiction': [ {'title': 'The Power of Now', 'author': 'Eckhart Tolle'}, {'title': 'The 7 Habits of Highly Effective People', 'author': 'Stephen Covey'}, {'title': 'The Immortal Life of Henrietta Lacks', 'author': 'Rebecca Skloot'} ] } def books_by_category(request, category, **kwargs): # Get the value of the sort_by parameter from the kwargs dictionary sort_by = kwargs.get('sort_by', 'author') # Find the books in the specified category and sort them by the specified field category_books = books.get(category, []) sorted_books = sorted(category_books, key=lambda book: book.get(sort_by, '')) # Build an HTML list of the books book_list = '<ul>' for book in sorted_books: book_list += f'<li>{book["title"]} by {book["author"]}</li>' book_list += '</ul>' # Return an HTTP response with the list of books return HttpResponse(f'Books in the {category} category, sorted by {sort_by}. {book_list}')
https://blog.w3programmers.com/trainings/python-beginning-to-advance/
এই উদাহরণে, আমরা বইয়ের Sample ডেটা সহ একটি books dictionary যোগ করেছি এবং বইগুলির একটি HTML তালিকা তৈরি করতে এই ডেটা ব্যবহার করার জন্য book_by_category view ফাংশনটি তৈরি করেছি। view ফাংশনটি URL pattern এ যেকোন additional named parameters ক্যাপচার করতে একটি category parameter এবং একটি **kwargs parameter নেয়। এটি sort_by প্যারামিটারের মান retrieve করতে kwargs dictionary এর get() method ব্যবহার করে, যদি parameter টি উপস্থিত না থাকে তবে ‘author’কে default করা হয়। এটি তারপর books dictionary এর মধ্যে বইয়ের list দেখতে category parameter ব্যবহার করে, নির্দিষ্ট ক্ষেত্র (হয় ‘title’ বা ”author”) দ্বারা বাছাই করে, এবং বইগুলির একটি HTML তালিকা তৈরি করে। অবশেষে, এটি একটি HTTP response প্রদান করে “[category] Book Category, [sort_by] দ্বারা sorted । [বইগুলির HTML list ]।”
django re_path() function
জ্যাঙ্গোতে, re_path() হল একটি function যা path() এ ব্যবহৃত সহজ সিনট্যাক্সের পরিবর্তে regular expressions ব্যবহার করে URL pattern নির্ধারণ করতে ব্যবহৃত হয়। re_path() আপনাকে আরও জটিল URL pattern ডিফাইন করতে দেয় যা সহজ সিনট্যাক্স দিয়ে প্রকাশ করা যায় না।
কিভাবে re_path() ব্যবহার করবেন তার একটি উদাহরণ এখানে দেওয়া হল:
from django.urls import re_path from . import views urlpatterns = [ re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/(?P<slug>[\w-]+)/$', views.article_detail), ]
এই উদাহরণে, আমরা একটি URL pattern সংজ্ঞায়িত করছি যা /articles/2022/03/27/my-article/ এর মতো URL-এর সাথে মেলে। re_path() এ ব্যবহৃত regular expression টি path() এ ব্যবহৃত সাধারণ string pattern এর চেয়ে জটিল। নিম্নে regular expression প্রতিটি অংশের ব্যাখ্যা দেওয়া হলো:
- ^ স্ট্রিং এর শুরুর সাথে match করা বুঝায়
- articles/ আক্ষরিক স্ট্রিং “articles/” এর সাথে match করা বুঝায়
- (?P
[0-9]{4}) একটি চার-সংখ্যার বছরের সাথে match করা বুঝায় এবং এটিকে year নামে একটি named parameter হিসাবে ক্যাপচার করে - /(?P
[0-9]{2}) একটি দুই-সংখ্যার মাসের সাথে match করা বুঝায় এবং এটিকে month নামক একটি named parameter হিসাবে ক্যাপচার করে - /(?P
[0-9]{2}) একটি দুই-সংখ্যার দিনের সাথে match করা বুঝায় এবং এটিকে day নামে একটি named parameter হিসাবে ক্যাপচার করে - /(?P
[\w-]+) এক বা একাধিক word characters বা hyphen এর সাথে match করা বুঝায় এবং এটিকে slug নামক একটি named parameter হিসাবে ক্যাপচার করে - /$ string এর শেষের সাথে match করা বুঝায়
এই URL pattern টি handle করার জন্য আপনি কীভাবে একটি view function ডিফাইন করতে পারেন তার একটি উদাহরণ এখানে দেওয়া হল:
from django.http import HttpResponse def article_detail(request, year, month, day, slug): return HttpResponse(f'Rendering article {slug} from {year}-{month}-{day}.')
এই উদাহরণে, article_detail view ফাংশনটি চারটি named parameters (year, month, day, and slug) নেয় যা URL pattern এ ডিফাইন করা named parameter গুলোর সাথে মেলে। এটি একটি message সহ একটি HTTP response প্রদান করে যাতে slug, year, month, এবং day parameter গুলোর সাথে অন্তর্ভুক্ত ।
সুতরাং যদি একজন ইউজার /articles/2022/03/27/my-articles/ এই URL ভিজিট করেন, তাহলে article_detail view ফাংশনটি ‘2022’ এর একটি বছরের প্যারামিটার, ’03’ এর একটি মাসের প্যারামিটার, ’27’ দিনের প্যারামিটার সহ কল করা হবে , এবং ‘my-article’-এর একটি slug parameter। এটি “2022-03-27 থেকে article my-article রেন্ডারিং” message সহ একটি HTTP response প্রদান করবে।
django তে path এবং re_path function দুটির মধ্যে পার্থক্য কী?
Django তে path() এবং re_path() এর মধ্যে মূল পার্থক্য হল তাদের URL patterns handle করার কৌশল বা ওয়ে ।
path() সহজ স্ট্রিং ম্যাচিং ব্যবহার করে URL patterns নির্ধারণ করতে ব্যবহৃত হয়। এটি আপনাকে placeholders (যেমন
re_path() রেগুলার এক্সপ্রেশন ব্যবহার করে URL patterns ডিফাইন করতে ব্যবহৃত হয়। এটি আপনাকে আরও জটিল URL patterns ডিফাইন করতে দেয় যা path() এ ব্যবহৃত সাধারণ সিনট্যাক্স ব্যবহার করে প্রকাশ করা যায় না। রেগুলার এক্সপ্রেশনগুলি path() তে ব্যবহৃত সাধারণ স্ট্রিং প্লেসহোল্ডারগুলির চেয়ে বেশি ধরণের ডেটা টাইপ এর সাথে মেলে, তাই re_path() আপনাকে URL প্যাটার্নগুলি সংজ্ঞায়িত করার ক্ষেত্রে আরও flexibility দেয়৷
অন্যান্য URL Configuration গুলোকে মূল প্রজেক্টের urls এ Include করা
Django তে include() ফাংশনটি অন্যান্য Apps এর URL configuration modules থেকে URL patterns গুলোকে প্রজেক্টের মেইন URL কনফিগারেশনে এ include করতে ব্যবহৃত হয়। আপনি যখন আপনার URL pattern গুলিকে আলাদা ফাইলগুলিতে সংগঠিত করতে চান বা যখন আপনি একাধিক view জুড়ে URL প্যাটার্নগুলি পুনরায় ব্যবহার করতে চান তখন এটি কার্যকর।
আপনি কীভাবে আপনার URL কনফিগারেশনে include() ব্যবহার করতে পারেন , নিম্নে তার একটি উদাহরণ দেওয়া হয়েছে:
ধরুন আপনার কাছে blog নামে একটি Django app আছে, urls.py নামক একটি পৃথক ফাইলে যার নিজস্ব URL pattern সেট আছে । আপনি আপনার প্রজেক্টের মেইন URL কনফিগারেশনে এই URL প্যাটার্নগুলি অন্তর্ভুক্ত করতে পারেন:
from django.urls import path, include from . import views urlpatterns = [ path('hello/', views.hello), path('blog/', include('blog.urls')), ]
এই উদাহরণে, path() ফাংশন দুটি URL patterns ডিফাইন করতে ব্যবহৃত হয়: একটি hello view এর জন্য এবং একটি blog app এর জন্য। include() function টি /blog/ URL prefix এর অধীনে blog.urls-এ ডিফাইন URL patterns অন্তর্ভুক্ত করতে ব্যবহৃত হয়।
blog/urls.py এর ভিতরের কোড গুলো অনেকটা নিম্নরূপ:
from django.urls import path from . import views urlpatterns = [ path('', views.blog_home), path('posts/', views.blog_posts), path('posts/<int:id>/', views.blog_post_detail), ]
এই উদাহরণে, blog/urls.py তিনটি URL patterns সংজ্ঞায়িত করে: একটি blog home পেজের জন্য (”), একটি blog posts গুলোর লিস্টের জন্য (‘posts/’), এবং একটি পৃথক ব্লগ পোস্টের জন্য (‘posts/
Include() ফাঙ্কশন আপনাকে মডুলার উপায়ে URL patterns গুলো ডিফাইন করতে দেয়, একই সাথে আপনার কোডকে আরও অর্গানাইজ করা এবং মেইনটেইন করা সহজ করে।
django url namespaces কি?
Django তে URL namespace আপনাকে আপনার URL pattern গুলিকে logical group গুলোতে সাজাতে এবং আপনার প্রোজেক্টের বিভিন্ন অংশে URL pattern গুলোর মধ্যে naming conflicts এড়াতে দেয়। একটি URL namespace হল একটি স্ট্রিং যা আপনি সম্পর্কিত URL pattern গুলির একটি group কে এসাইন করতে পারেন, যা আপনাকে সেই প্যাটার্নগুলিকে একটি unique way তে উল্লেখ করতে দেয়৷
যখন আপনি Django তে একটি URL namespace ডিফাইন করেন, তখন আপনি মূলত একটি prefix তৈরি করেন যা সেই নেমস্পেসের প্রতিটি URL প্যাটার্নের শুরুতে যোগ করা হয়। এই prefix টি আপনার প্রোজেক্টের বিভিন্ন অংশের জন্য URLs গুলিকে আলাদা করতে সাহায্য করে, যেটি বিশেষভাবে উপযোগী হতে পারে যদি আপনার একই URL সহ একাধিক App থাকে।
Django তে একটি URL namespace ডিফাইন করতে, আপনি আপনার প্রজেক্টের urls.py ফাইলের include() ফাংশনে একটি namespace parameter যোগ করুন। উদাহরণ স্বরূপ:
from django.urls import path, include urlpatterns = [ path('blog/', include('blog.urls', namespace='blog')), path('news/', include('news.urls', namespace='news')), ]
এই উদাহরণে, blog এবং news অ্যাপ উভয়েরই তাদের নিজ নিজ urls.py ফাইলগুলিতে ডিফাইন করা URL patterns এর নিজস্ব সেট রয়েছে৷ একটি namespace parameter সহ include() function ব্যবহার করে এই ফাইলগুলি include করে, আমরা প্রতিটি URL pattern এর জন্য একটি namespace তৈরি করছি।
একবার আপনি আপনার URL প্যাটার্নগুলির জন্য একটি namespace ডিফাইন করলে, আপনি {% url %} template tag বা reverse() function ব্যবহার করে একটি unique way তে তাদের উল্লেখ করতে পারেন৷ উদাহরণস্বরূপ, ব্লগের namespace এ blog_detail view এর URL প্যাটার্নটি reverse করতে, আপনি নিম্নলিখিত কোডটি ব্যবহার করবেন:
{% url 'blog:blog_detail' post.id %}
এখানে, blog হল namespace, এবং blog_detail হল সেই namespace এর মধ্যে URL প্যাটার্নের নাম। URL-এ namespace অন্তর্ভুক্ত করে, আপনি নিশ্চিত করছেন যে আপনি সঠিক URL প্যাটার্ন উল্লেখ করছেন এমনকি আপনার প্রজেক্টের একই নামের অন্য URL প্যাটার্ন থাকলেও।
https://blog.w3programmers.com/trainings/python-beginning-to-advance/
django register_converter() function
django তে register_converter() ফাংশনটি একটি custom converter কে রেজিস্টার করতে ব্যবহৃত হয় যা URL patterns এ ব্যবহার করা হয় ।
Django তে, আপনি চাইলে URL pattern এ converters যুক্ত করতে পারেন এবং কনভার্টার গুলোকে URL থেকে মান বের করার কাজে ব্যবহার করতে পারেন এবং সেগুলোকে আর্গুমেন্ট হিসেবে view তে পাঠাতে পারেন।
ধরা যাক যে আপনি একটি custom converter তৈরি করতে চান যা YYYY-MM-DD ফরম্যাটে একটি date string parse করতে পারে এবং এটি একটি datetime.date অবজেক্টে convert করতে পারে।
প্রথমত, আপনাকে আপনার App তে urls.py ফাইলে converter function টি ডিফাইন করতে হবে এবং register_converter() ফাঙ্কশন ব্যবহার করে converter টি কে রেজিস্টার করতে হবে এবং একই সাথে url pattern এ path টি বলে দিতে হবে।
from django.urls import path,register_converter from . import views from .views import event_view from datetime import datetime from datetime import datetime class DateConverter: regex = r'\d{4}-\d{2}-\d{2}' def to_python(self, value): return datetime.strptime(value, '%Y-%m-%d').date() def to_url(self, value): return value.strftime('%Y-%m-%d') register_converter(DateConverter, 'date') urlpatterns = [ path('event/<date:date_arg>/', event_view), ]
regex attribute টি regular expression pattern কে ডিফাইন করে যা converter টির সাথে মিলবে। এই ক্ষেত্রে, আমরা YYYY-MM-DD ফর্ম্যাটের সাথে মেলে এমন string গুলি খুঁজছি৷
to_python() method টিকে বলা হয় যখন Django একটি URL pattern কে একটি view function argument এ কনভার্ট করে। এটি মিলে যাওয়া string টি নেয় এবং এটিকে একটি Python object এ কনভার্ট করে যা view function এ পাস করা হবে। এই ক্ষেত্রে, আমরা datetime.date অবজেক্টে স্ট্রিং পার্স করতে datetime.strptime() ব্যবহার করছি।
to_url() method টি বলা হয় যখন Django একটি view function argument থেকে একটি URL তৈরি করে। এটি Python object টি নেয় এবং এটিকে একটি string এ convert করে যা URL এ ব্যবহার করা যেতে পারে। এই ক্ষেত্রে, আমরা একই YYYY-MM-DD ফর্ম্যাটে তারিখটিকে string হিসাবে ফর্ম্যাট করতে strftime() ব্যবহার করছি।
এবার , আপনার App তে views.py ফাইলে নিচের মতো করে event_view ফাঙ্কশন টি define করুন :
from django.http import HttpResponse from django.http import HttpResponseNotFound dummy_data = { '2022-01-01': {'event': 'New Year\'s Day', 'location': 'New York City'}, '2022-02-14': {'event': 'Valentine\'s Day', 'location': 'Everywhere'}, '2022-07-04': {'event': 'Independence Day', 'location': 'Washington D.C.'}, } def event_view(request, date_arg): try: event_info = dummy_data[date_arg.strftime('%Y-%m-%d')] except KeyError: return HttpResponseNotFound('No event found for date {}'.format(date_arg)) response_data = { 'event': event_info['event'], 'location': event_info['location'], } message="Event: "+response_data['event']+"<br>Location: "+response_data['location']; return HttpResponse(message)
এই উদাহরণে, আমরা URL-এ পাস করা তারিখের event information retrieve করার চেষ্টা করছি। আমরা date_arg অবজেক্টের strftime() method টি ব্যবহার করছি এটিকে একটি string -এ convert করতে যা dummy_data dictionary এর key গুলির সাথে মেলে।
প্রদত্ত তারিখের জন্য কোন ইভেন্ট না থাকার কারণে যদি একটি key error raise হয়, আমরা একটি 404 response রিটার্ন করি। অন্যথায়, আমরা event_info dictionary থেকে event এবং location values retrieve করি এবং response ডেটাতে সেগুলি রিটার্ন দিই।
সুতরাং আপনি যদি URL http://localhost:8000/event/2022-01-01/ যান, উদাহরণস্বরূপ, আপনি এইরকম একটি প্রতিক্রিয়া পাবেন: