বাংলায় জ্যাঙ্গো

আসসালামুয়ালাইকুম, আশা করি আপনাদের জ্যাঙ্গো শেখা বেশ ভালই চলছে। প্রগ্রামিং করার সময় আমরা ইউজারের কাছ থেকে ডাটা ইনপুট নেয়ার জন্য input() ফাংশন ব্যাবহার করি। আমাদের জ্যাঙ্গো এপ্লিকেশনে আমরা ইউজারের কাছ থেকে ডাটা নিব কিভাবে ? উত্তর হল ফর্ম। আমরা ফর্ম ব্যাবহার করে ইউজারের কাছ থেকে ইনপুট নেব এবং ইউজারের দেয়া ডাটা দিয়ে চমৎকার সব কাজ করব।

প্রথম পর্বে আমরা Html ফর্ম ব্যাবহার করে ইউজারের কাছ থেকে ডাটা নিব। ২য় পর্বে জ্যাঙ্গো ফর্ম ব্যাবহার করে ইউজারের কাছ থেকে ডাটা নিব এবং ডাটা প্রসেস করে ইউজারকে দেখাব।

App তৈরী

user_info নামে নতুন একটু এপ তৈরী করি।

python manage.py startapp user_info

settings.py এ user_info যুক্ত করি।

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'blog_post',
    'cost_management',
    'information',
    'user_info'
]

Views তৈরী

এই কাজটি করার জন্য প্রথমে আমরা একটি ভিউ তৈরী করি।  যেই ভিউ এর মাধ্যমে আমরা একটি html ফর্ম দেখাব।

user_info/views.py

from django.shortcuts import render


def show_user_info(request):
    """
    A django view to show user's Information
    """
    return render(request, 'user_info/user_info.html')

Templates/user_info এর মধ্যে user_info.html তৈরী করি । এই ভিউকে দেখার জন্য url তৈরী করি। user_info/urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('info/', views.show_user_info, name='user-info'),

]

Base urls ( banglaidj/urls.py) এ user_info কে ইনক্লুড করে দেয়

urlpatterns = [
   -------------
   -------------
    path('user/', include('user_info.urls'), name='user'),

]

এখন ব্রাউজারে http://localhost:8000/user/info/ দিলে একটি ফাকা পেজ দেখতে পাবেন কারন আমরা user_info.html এ কিছুই এখনো লিখিনি।

user_info.html এ একটি HTML ফর্ম লিখিঃ

{% extends 'base.html' %}

{% block content %}
<h1>খরচ খুজুন </h1>

<form action="/user/info/" method="post">
        {% csrf_token %}
        তোমার নাম কি ? <input type="text" name="user_name">
        <input type="submit" value="ঠিক আছে">

</form>

{% endblock %}

আমাদের এই ভিউ এর প্রকৃত ইউআরএল ছিল localhost:8000/user/info । ব্রাউজারে প্রবেশ করালে একটি ফর্ম দেখতে পারব।এখন আমরা ফর্মের মাধ্যমে কিছু ডাটা show_user_info ভিউ এর মধ্যে পাঠাতে চাই এবং এই ডাটা নিয়ে আমরা চমৎকার কিছু কাজ করব।

csrf_token কি ?

একটা ফর্ম দিয়ে আসলে সার্ভারে POST রিকুয়েষ্ট পাঠানো হয়। ধরুন আপনার একটি ফর্ম আছে mysite.com/sell/ এ । ফর্ম এর কাজ হচ্ছে এই url এ POST রিকুয়েষ্টের মাধ্যমে কিছু ডাটা পাঠাবে। একজন ক্র্যাকার চাইলে ওই ইউআরএল এ আপনার ফর্ম ব্যাবহার না করে cUrl বা postman ব্যাবহার করে POST রিকুয়েষ্ট পাঠাতে পারে এবং ডাটার মধ্যে তার হ্যাকিং এর ডাটা পাঠিয়ে দিতে পারে।

এই বিপদ থেকে রেহায় পেতে জ্যাঙ্গো তার ফর্মের মধ্যে গোপনে একটি টোকেন জেনারেট করে দেয় এবং ফর্ম সাবমিট করা হলে ডাটার সাথে ওই টোকেনও পাঠিয়ে দেয় এবং টোকেনটি চেক করে। বিস্তারিত

HTTP Request কি?

যখন আমাদের ব্রাউজার আমাদের সামনে কোন ওয়েব পেজ দেখায় তখন ব্রাউজার আসলে কি করে? ব্রাউজার আসলে একটা ওয়েব সার্ভারের কাছে request করে। ভাই তুমি আমাকে প্লিজ একটা পেজ দেখাও। সার্ভার তখন ব্রাউজারের রিকুয়েষ্ট কে নিয়ে পরীক্ষা নিরীক্ষা করে দেখে ব্রাউজার কি ধরনের রিকুয়েষ্ট করেছে এবং সেই অনুযায়ী একটা response পাঠায় যেমন: “Hello browser”।

যখন ব্রাউজারে  localhost:8000/cost/search প্রবেশ করানো হয় তখন ব্রাউজার সার্ভারের কাছে request পাঠাচ্ছে যার টাইপ GET কারন ব্রাউজার তখন সার্ভারের কাছ থেকে কিছু গ্রহন করছে এবং সার্ভারে response হিসেবে user_info.html ব্রাউজেরর কাছে পাঠিয়ে দিচ্ছে।

পরীক্ষা করার জন্য show_user_info ভিউ এর মধ্যে লিখুন                               print(“request type: “, request.method) এবং ব্রাউজার refresh করুন। টার্মিনালে লক্ষ করুন।

যেহেতু আমরা ফর্মের মাধ্যমে কিছু ডাটা সার্ভারের কাছে পাঠাচ্ছি তখন সার্ভারের  request এর ধরন হবে POST। ফর্মে কিছু লিখে submit বাটনে ক্লিক করে আবারও টার্মিনালে লক্ষ করি।

অর্থাৎ এখন আমরা যেহেতু কিছু ডাটা সার্ভারের কাছে পাঠাচ্ছি তাই আমাদের রিকুয়েষ্ট টাইপ POST ।

ডাটা নিয়ে খেলা করুনঃ

আচ্ছা, আমরা ফর্মে যে ডাটা পাঠালাম এটা পাব কিভাবে ? একটু অপেক্ষা করুন । আগে দেখে নিই সার্ভারে আসলে কি কি ডাটা পোষ্ট হয়েছে। view এর মধ্যে আবার লিখুন print(“request data”, request.POST)

def show_user_info(request):
    print("request data: ", request.POST)
    context = {}
    return render(request, 'user_info/user_info.html', context)

ফর্মে hello লিখে সাবমিট করুন এবং টার্মিনালে লক্ষ করুন

GET  রিকুয়েষ্টের ক্ষত্রে request data: <QueryDict: {}>কোন ডাটা নেই কারন আমরা কিছু পোষ্ট করি নি। POST রিকুয়েষ্টের ক্ষেত্রে QueryDict এর মধ্যে আমরা csrfmiddlewaretoken ও user_name এর ভ্যালু পেয়েছি।

user_name এর ভ্যালু আমরা পেতে পারি এভাবে

user_name_value = request.POST["user_name"]

লক্ষ করুন, এই কোডটি শুধু পোষ্ট রিকুয়েষ্টেই ডাটা দেবে। তাই আমরা লিখতে পারি , যদি রিকুয়েষ্ট POST হয় তাহলে ফিল্ডের ডাটা নাও ।

def show_user_info(request):
    if request.method == 'POST':
        user_name_value = request.POST["user_name"]
        print("Your name is: ", user_name_value)

    context = {}
    return render(request, 'user_name/user_name.html', context)

এখন ফর্মটি পুরন করে টার্মিনালে লক্ষ করলে দেখবেন Your name is: হারুন লেখা উঠছে।

এখন একটা ছোট্ট খেলা করি। আমরা ইউজারের কাছ থেকে নাম ইনপুট নেব এবং ইউজারকে বলবঃ আসসালামুয়ালাইকুম বন্ধু অমুক , তুমি কেমন আছ ?

views.py

from django.shortcuts import render


def show_user_info(request):
    """
    A django view to show user's Information
    """
    print("request data: ", request.POST)
    if request.method == 'POST':
        user_name = request.POST["user_name"]
        context = {"name": user_name}
        return render(request, 'user_info/user_info.html', context)
    return render(request, 'user_info/user_info.html')

 

user_info/user_info.html

{% extends 'base.html' %}

{% block content %}
<h1>স্বাগতম বন্ধু !! </h1>

<form action="/user/info/" method="post">
        {% csrf_token %}
        তোমার নাম কি ? <input type="text" name="user_name">
        <input type="submit" value="ঠিক আছে">

</form>
    {% if name %}
       <p> আসসালামুয়ালাইকুম বন্ধু {{ name }}, তুমি কেমন আছ ?</p>
    {% endif %}

{% endblock %}

বাংলায় জ্যাঙ্গো টিউটোরিয়াল সিরিজের আগামী পর্বে  আমরা ইউজারের কাছ থেকে আরো কিছু তথ্য নিয়ে ইউজারকে দেখাবো।

<< সূচিপত্র

 

Leave a Reply

Your email address will not be published. Required fields are marked *