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

NID varification পোর্টাল তেরী, পর্ব-২

by , on
February 23, 2019

গত পর্বে nid verification করার জন্য একটি এপিআই তৈরী করেছিলাম। আজ আমরা দেখব কিভাবে যে কেউ এপিআইটি তার সাইটে ব্যাবহার করতে পারে। আমরা Javascript ব্যাবহার করে পোর্টালের api কল করব।  আপনার কম্পিউটারের যে কোন স্থানে check_nid.html তৈরী করুন।

<!doctype html>
  <html lang="en">
  <head>
    <!-- Required meta tags -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T"crossorigin="anonymous">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <script src="app.js"></script>
  </head>
  <body>
    <div class=" container">
      <div class="jumbotron">
      <h2> Check National Identification Number </h2>
        <form>
          <div class="form-row align-items-center">
            <div class="col-md-8">
              <label class="sr-only" for="inlineFormInput">Name</label>
              <input type="text" class="form-control mb-4"id="id_nid" placeholder="NID card number">
            </div>
            <div class="col-md-3">
              <a id="button"class="btn btn-primary mb-4">Submit</a>
            </div>
          </div>
        </form>
        <p id="status"></p>
      </div>
    </div>

    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1"crossorigin="anonymous"></script>
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM"crossorigin="anonymous"></script>
   </body>
</html>
একই স্থানে app.js নামে আরেকটি ফাইল তৈরী করুন
$(document).ready(function(){
    $("#button").click(function(){
      var nid = $('#id_nid').val();
      var api_url = 'http://localhost:8000/nid/check/'+nid
      $.ajax({
              url: api_url,
              method: 'get',
              success: function(data){
                  var status_msg = $('#status');
                  // if api return True
                  if (data.status){
                      status_msg.text("Status: Valid");
                      status_msg.css('color','green');
                  }
                  else // if api return False
                  {
                      status_msg.text("Status: Invalid");
                      status_msg.css('color','red');
                  }
              },

              error: function(err){
                  console.log("error",err);
              }
          });
    });
  });
এখন check_nid.html ফাইলটি ব্রাউজারে ওপেন করুন। সুন্দর একটি ফর্ম দেখতে পাবেন। আপনার ডাটাবেজে থাকা nid number প্রবেশ করিয়ে check বাটনে ক্লিক করুন। প্রত্যাশিত ফলাফল পাবেন না। console চালু করে একটা ইরর দেখতে পাবেন। আমরা কোন সার্ভার থেকে nid_server কে কল করছি তা nid server জানে না। nid_server তার নিজের আইপি ছাড়া অন্য কোন সার্ভার থেকে আসা কলকে গ্রহন করবে না। nid_server কে আমরা বলে দিতে পারি তুমি যে কোন সার্ভার থেকে আসা কলকেই গ্রহন করবে। nid_server প্রজেক্টে নিজের কাজগুলো করিঃ
django-cors-headers ইন্সটল করি
pip install django-cors-headers

nid_server/settings.py এ নিম্নোক্ত পরিবর্তণ করি।
INSTALLED_APPS এ যুক্ত করি
INSTALLED_APPS = (
    ...
    'corsheaders',
    ...
)
MIDDLEWARE এ যুক্ত করি
MIDDLEWARE = [  # Or MIDDLEWARE_CLASSES on Django < 1.10
    ...
    'corsheaders.middleware.CorsMiddleware',
    ...
]

সকল সার্ভারকে অনুমতি প্রদান করতে নিচের লাইনটি যুক্ত করি।
CORS_ORIGIN_ALLOW_ALL = True
পুনরায় সার্ভারটি চালু করে check_nid.html ফাইটি রিলোড দিই। এখন সঠিক nid number প্রবেশ করালে দখাবে status: valid.

NID verification পোর্টাল তৈরী, পর্ব – ১

by , on
February 23, 2019

বাংলায় জ্যাঙ্গো টিউটোরিয়ালের Django Rest Framework অধ্যায়ের প্রথম পর্বে আপনাদেরকে স্বাগতম।

লক্ষ:

চলুন একটা NID ভ্যারিফিকেশন পোর্টাল তৈরী করা যাক। অর্থাৎ, প্রথমে এটা এপলিকেশন তৈরী করবো যেখানে আমাদের NID এর তথ্য থাকবে। একটা url থাকবে localhost:8000/nid/check/<nid-number> যেখানে রিকুয়েষ্ট পাঠালে আইডিটা ভ্যালিড কিনা যাচাই করবে। যদি এই নাম্বারের কোন NID থাকে তাহলে বলবে Valid, অন্যথায় Invalid.

তাহলে দেখলাম আমাদের এই প্রজেক্টের ২ টি পার্ট

১) NID তথ্য রাখার জন্য একটা  এপলিকেশন, যখানে NID তথ্য জমা রাখা যাবে এবং একটা url যার মাধ্যমে তথ্য যাচাই করা যাবে। এটাকে আমরা NID server বলতে পারি

২) একটা পোর্টাল যেখান থেকে NID server কে রিকুয়েস্ট করে তথ্য যাচাই করা যাবে।

১) NID server তৈরীঃ

NID server নামে একটি নতুন প্রজেক্ট তৈরী করি।

django-admin startproject nid_server

nid_server প্রজেক্টের মধ্যে একটি এপ তৈরী করি nid নামে

cd nid_server
python manage.py startapp nid

settings.py এ nid কে যুক্ত করি।NID তথ্য রাখার জন্য nid/models.py এ একটি মডেল তৈরী করি

class NidInfo(models.Model):
    nid_number = models.CharField(max_length=50)
    name = models.CharField(max_length=50)

    def__str__(self):
        returnself.name
admin.py এ ক্লাসটি যুক্ত করি
from .models import NidInfo

admin.site.register(NidInfo)
মাইগ্রেশন করি
python manage.py makemigrations

python manage.py migrate

superuser তৈরী করে, সার্ভার রান করি এবং এডমিন প্যানেলে কিছু NID তথ্য জমা করি। এখন একটি url তৈরী করতে হবে যেখানে কল করে যে কেউ NID নাম্বার যাচাই করতে পারবে। nid/views.py

from django.http import JsonResponse
from .models import NidInfo

def check_nid(request, nid_number):
    is_exist = NidInfo.objects.filter(nid_number=nid_number).exists()
    return JsonResponse({'status': is_exist})
exists() ম্যাথডটি True/False রিটার্ণ করবে। Response, ডাটাকে Json আকারে ইউজারের কাছে পাঠাবো, যেন ইউজার তার টেমপ্লেটে সহজে ব্যাবহার করতে পারেন। এজন্য JsonResponse ব্যাবহার করা হয়েছে।
nid/urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('check/<nid_number>', views.check_nid)
]

nid_server/urls.py

from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('nid/', include('nid.urls'))
]

ব্রাউজারে http://localhost:8000/nid/check/123456789 প্রবেশ করালে {“status”: true } অথবা {“status”: false } দেখতে পাবেন।

Django Rest Framework এর ব্যাবহারঃ

আমাদের অতি সাধারণ API প্রস্তুত। এখন আপনি যে কোন সার্ভার থেকে আপনি এপিআইকে কল করে ডাটা পেতে পারেন। কিন্তু আমাদের প্রস্তুতকৃত সার্ভারটি এখনো পূর্ণাঙ্গতা পায় নি। কারণ এভাবে কোন API তৈরী করলে অনেক সমস্যা থেকে যায়। যেমন স্টাটাস রিটার্ণ করা, সিকিউরিটি, অথেনটিকেশন ইত্যাদি। এখ সমস্ত কিছু যোগান দেয়ার জন্য তৈরী করা হয়েছে Django Rest Framework. যার সাহায্যে আপনি খুব সহজে  API তৈরী করতে পারবেন। আমাদের উপরিউক্ত কোডকেই আমরা এখন Django Rest Framework এর মাধ্যমে লিখবো।
প্রথমেই Django Rest Framework ইনস্টল করি
pip install djangorestframework
settings.py এর INSTALLED_APPS এ rest_framework যুক্ত করি
INSTALLED_APPS = (
    ...
    'rest_framework',
)
আমাদের ভিউ ফাংশনকে নিচের মত করে পরিবর্তন করি
from rest_framework.response import Response
from rest_framework.decorators import api_view
from .models import NidInfo

@api_view()
def check_nid(request, nid_number):
    is_exist = NidInfo.objects.filter(nid_number=nid_number).exists()
    return Response({'status': is_exist})

সাধারণ ভিউ কে api view এ রূপান্তার করার জন্য api_view ডেকরেটর ব্যাবহার করা হয়েছে এবং রেসপন্স কে রেস্ট এপিআই রেস্পন্স এ রূপান্তর করা হয়েছে। এখন আপনার ব্রাউজার রিলোড দিলে সম্পূর্ণ নতুন চেহারা দেখতে পাবেন।

২য় পর্বে আমরা একটি html টেমপ্লেট তৈরী করব, যেখান থেমে nid server কে কল করে তথ্য যাচাই করা যাবে।

terms

by , on
February 19, 2019

test

reverse() এবং redirect() এর মধ্যে পার্থক্য

by , on
December 27, 2018

ধরি আমাদের দুইটি url আছে এরকম

path('student/login', views.user_login, name='login'),
path('student/logout', views.user_logout, name='logout'),

এখন আমরা চাই, কোন ইউজার লগআউট করলে তাকে আবার লগিন পেজে নিয়ে যাবে । তাহলে আমরা  লগআউট ভিউ এ redirect() ফাংশনটিকে  কয়েকভাবে লিখতে পারি

১। url এর নাম লিখে ( name=’login’)

from django.shortcuts import redirect
from django.urls import reverse

def user_logout(request):
    logout(request)
    return redirect('login')

২। সরাসরি url লিখে

from django.shortcuts import redirect
from django.urls import reverse

def user_logout(request):
    logout(request)
    return redirect('/student/login')

৩। reverse() ফাংশন ব্যাবহার করে

from django.shortcuts import redirect
from django.urls import reverse

def user_logout(request):
    logout(request)
    return redirect(reverse('login'))

reverse() ফাংশন URL এর নামকে সরাসরি URL স্টাইলে রূপান্তর করে

python manage.py shell

>>> from django.urls import reverse
>>> reverse('login')
'/student/login'

৪। redirect() ফাংশন মডেল অবজেক্টকেও গ্রহন করে। অবজক্টটি  get_absolute_url() ফাংশনকে কল করে। 

from django.shortcuts import redirect

def my_view(request):
    ...
    obj = MyModel.objects.get(...)
    return redirect(obj)

বিস্তারিত দেখুন redirect(), reverse()

১-৬ঃ Template কে Dynamic করা

by , on
January 7, 2017

index.html ফাইলে কিছু কোড লিখে ফেলি

<html> 
    <head></head> 
    <body> 
      <h1>স্বাগতম বাংলায় জ্যাঙ্গো টিউটোরিয়াল এর প্রথম টেমপ্লেট এ </h1>
      <h2>Hello, I am Harun Ur Rashid </h2> 
    </body> 
</html>

আমাদের পেজে Hello, I am Harun Ur Rashid । কিন্তু এটা তো আমরা টেমপ্লেটের মাঝে নিজের হাতে তৈরি করেছি। আমরা এখন চাচ্ছি views.py ফাইলে আমাদের নাম পরিবর্তন করব, স্বয়ংক্রিয় ভাবে টেমপ্লেটেও নাম পরিবর্তন হয়ে যাবে।

পুর্বেই বলেছিলাম যে render()  ফাংশন তিনটি প্যারামিটার গ্রহণ করে, এই তৃতীয় প্যারামিটারটিকে context variable বলে। context variable  হিসেবে Dictionary ব্যাবহার করা হয়। এটা অনেকটা পাইপ লাইনের মত কাজ করে । এই পাইপ লাইনের মাধ্যমে view থেকে template এ ডাটা পাঠানো যায়।

তাহলে আমাদের render() এর রূপ হবে

render(request, ‘index.html’, {} )

এখানে Dictionary টি কে আমরা নিজের মনের মত সাজাতে পারি

{

'name': “Harun Ur Rashid”

'district':”kushtia”

}

এখন view দেখতে হবে,

def home(request):
 	return render(request, 'index.html',{'name':”harun Ur Rashid”,'district':”kushtia”})

আবারও index.html ফাইলকে পরিবর্তন করি,

<html> 
    <head></head> 
    <body> 
      <h1>স্বাগতম বাংলায় জ্যাঙ্গো টিউটোরিয়াল এর প্রথম টেমপ্লেট এ </h1>
      <h2>Hello, I am {{ name }}</h2>
      <h2>My District is: {{ district }}</h2>
    </body>
</html>

আমরা টেমপ্লেট এর মধ্যে {{ }} চিহ্ন ব্যাবহার করেছি। একে জ্যাঙ্গো টেমপ্লেট ইঞ্জিন এর ভাষায় template variable বলা হয় । Variable এর ভ্যালু দেখার জন্য  {{ variable_name }} ব্যাবহার করা হয়।  অর্থাৎ,  Dictionary এর key এর ভ্যালু যদি সাধারন string, number হয় তাহলে {{ key_name }} ব্যাবহার করে লিখতে পারি। কিন্তু Dictionary এর key এর ভ্যালু যদি কন্ডিশন, লুপ ইত্যাদি হয় তাহলে {%  %} চিহ্ন ব্যাবহার করা হয়। একে Template Tag বলা হয়।    এভাবে আমরা ইচ্ছামত Dictionary এর key পরিবর্তন করে টেমপ্লেট এর Value পরিবর্তন করতে পারি ।

Template এ সকল পোষ্ট দেখানোঃ

এখন আমরা দেখব কিভাবে আমাদের এডমিন প্যানেল থেকে তৈরি করা সকল পোষ্ট আমাদের Template দেখানো যায় ।

প্রথমে views.py এর home() ভিউ দেখি। এই ভিউ এর মধ্যে ডাটাবেজে জমা হওয়া সকল পোষ্ট নিয়ে আসব। এরপর ভিউ থেকে টেমপ্লেটে এ পাঠিয়ে দেব।

from django.shortcuts import render
from .models import Post

def home(request):
    all_post = Post.objects.all()
    return render(request, 'index.html')

from .models import Post  দ্বারা আমরা models.py ফাইলের Post  ক্লাসটি views.py ফাইলে import করলাম। আমরা যখন এডমিন প্যানেল থেকে নতুন নতুন Post তৈরি করছিলাম তখন আসলে Post ক্লাসে object তৈরি করছিল। এক একটি পোষ্ট আসলে এক একটি object. তাহলে সকল পোষ্ট আনতে হলে পাইথনের ভাষায় সকল objects নিয়ে আসতে হবে। Post.objects.all() দিলে সকল পোষ্ট লিস্ট আকারে চলে আসবে। এখানে Post হচ্ছে  models.py এর  Post ক্লাস । এখন এই পোষ্ট এর লিস্ট কে একটি variable এর মধ্যে জমা করলাম। আমরা প্রিন্ট করে দেখতে পারি  all_post  এর মধ্যে কি জমা হয়েছে । নিচের লাইনে লিখুন print(all_post)। পেজটি রিলোড দিয়ে টার্মিনালে লক্ষ করি

<QuerySet [<Post: my first post>, <Post: My 2nd post>]>

অর্থাৎ, all_post  একটি QuerySet ( Post.objects.all() কে Query বলে) যার মধ্যে লিস্ট আছে । লিস্টের মধ্যে লক্ষ করি , প্রতিটি পোষ্টের টাইটেল দেখাচ্ছে। model.py এর def __str__() ম্যাথড দ্বারা আমরা এই টাইটেল কে রিটার্ন করতে বলেছিলাম।

আমরা ফর লুপের মাধ্যমে প্রতিটা পোষ্ট আলাদা করে ফেলতে পারি ।

def home(request):
    all_post = Post.objects.all()
    for post in all_post:
        print(post)

    return render(request, 'index.html')

আমাদের Post ক্লাসের মধ্যে title ও description  ফিল্ড আছে। print(post.title), print(post.description) দিয়ে মজা দেখুন। প্রিতিবার কোড পরিবর্তন করার পর পেজ রিলোড দিতে ভোলা চলবে না।

from .models import Post


def home(request):
    all_post = Post.objects.all()
    return render(request, 'index.html', {'all_post_list': all_post})
# index.html

<html>
<head></head>
<body>
    <h1>স্বাগতম বাংলায় জ্যাঙ্গো টিউটোরিয়াল এর প্রথম টেমপ্লেট এ </h1>

    {% for post in all_post_list %}
       {{ post }}
    {% endfor %}
</body>
</html>

পরবর্তী পোষ্ট >>