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

প্রজেক্টভিত্তিক অনলাইন জ্যাঙ্গো কোর্স

by , on
February 19, 2019

কোর্স সম্পর্কেঃ

জ্যাঙ্গো পৃথিবীর অন্যতম জনপ্রিয় ওয়েব ডেভেলপমেন্ট ফ্রেমওয়ার্ক। ছোট থেকে বড়, যে কোন ধরণের ওয়েব এপলিকেশন তৈরীর জন্য জ্যাঙ্গো ব্যাবহার করা হয়। আপনার জ্যাঙ্গো শেখার পথকে সহজ করতে প্রজেক্টভিত্তিক অনলাইন জ্যাঙ্গো কোর্সের আয়োজন করেছি। প্রজেক্টের মাধ্যমে শিখতে থাকলে আপনার শেখাটা অনেক সহজ ও আনন্দদায়ক হবে ইনশাআল্লাহ। ৪ মাসের এই কোর্সে আমরা ২ টি প্রজেক্ট পূর্ণাঙ্গভাবে শেষ করার চেষ্টা করব।Agile Methodology অনুসরন করে সফটওয়ার বাজারে বিক্রয় উপযোগী একটি পুর্নাঙ্গ প্রজেক্টের MVP (Minimum Viable Product) তৈরী করা হবে।  প্রতি সপ্তাহে বাড়ির কাজ দেয়া হবে।( ইনশাআল্লাহ)

বিবরণঃ

সময়ঃ শুক্র, শনি সকাল ৮-১০ টা
মেয়াদঃ ৪ মাস , ৩২ টি ক্লাস, ৬৪ ঘন্টা
মাধ্যমঃ Skype
ক্লাস শুরুঃ ১লা মার্চ ২০১৯, শুক্রবার

কোর্স ফিঃ

রেজিষ্ট্রশন ৫০০০ টাকা, ১ মাস পর ২০০০, সর্বমোট ৭০০০

শর্তঃ

কোর্সটিতে অংশগ্রহন করতে হলে আপনাকে অবশ্যই পাইথন ব্যাসিক, ওওপি, এইচটিএমএল জানতে হবে।

যোগাযোগঃ ফেচবুক পেজ, , ফেচবুক গ্রুপ

জাওয়ালঃ 01715251562

বিঃদ্রঃ সুন্নাহ মোতাবেক দাড়িওয়ালাদের জন্য কোর্স ফি এর  উপর বিশেষ ছাড়

কোর্স কারিকুলামঃ

  • Getting started with Django2
  • How web works
  • Basic Django ( models, views, templetes, urls, Forms)
  • Django Queryset
  • Model manager
  • Class Based View
  • Django Rest API
  • How to write smart code
  • Working with Postgresql Database
  • Version control with Git
  • Basic Javascript to use Rest API
  • Blog project
  • School Management System Project

রেজিষ্ট্রেশনঃ

রেজিষ্ট্রেশন ফি বিকাশে পাঠিয়ে নিচের ফর্মটি পূরণ করুন। বিকাশঃ 01715251562

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()

Uncategorized

Go from zero to hero in Python3 – Live online course

by , on
November 13, 2018

COURSE DESCRIPTION

Python is now the best programming language to learn in 2018. Python is very easy to learn and you will find it in web application development, machine learning, data science, desktop app, hardware programming etc.

Course curriculum:

  • Getting Started with Python3
  • Data structure
  • List comprehension
  • Condition
  • Function
  • OOP -Object oriented Programing
  • Exception Handling
  • File Handling
  • Web application development with Flask
  • Basic Use of GIT
  • Basic Algorithms
  • 100 + Problem solving

About Course:

Time: Friday, Saturday at 9 P.M to 11 P.M

Total class: 16

Duration: 2 months ( 30 hours)

Class Started: 23 November 2018

 Course Type: Online

 Contact

Contact: Facebook Page Facebook GroupBanglai-django Facebook group

Phone: 01715251562

Note: Class will be arranged via “Skype“. You must submit Home task and also attend group study regularly.  If anyone failed to attend class, we will provide video of the class. You should fill up registration form and pay course fee before registration. 
Register Now

Uncategorized

Adding Ajax Functionality with Django (Bangla)

by
, on
November 12, 2018
এই টিউটোরিয়ালটিতে জ্যাঙ্গোতে বিভিন্ন পোস্ট বা ইমেজে কিভাবে লাইক বাটন যোগ করা যায় সেই বিষয়ে জানার চেষ্টা করবো। এই কাজটি আমরা Asynchronous উপায়ে (অর্থাৎ সম্পূর্ণ পেইজটি লোড না করে শুধু মাত্র কিছু অংশকে লোড করে সার্ভার আপডেট করার মাধ্যমে) করার চেষ্টা করবো। আর এই কাজটি করার জন্য আমরা Ajax ব্যবহার করবো। Ajax সম্পর্কে জানার জন্য এই লিঙ্কটি দেখতে পারেন।

STEP-01:

প্রথমেই ধরে নিই blog নামের একটি অ্যাপের models.py তে Post নামের একটি মডেল ক্লাস রয়েছে। blog/models.py
class Post(models.Model):
    author = models.ForeignKey(User, on_delete=models.CASCADE,related_name='blog_posts')
    title = models.CharField(max_length=250)     
    body = models.TextField()
    publish = models.DateTimeField(default=timezone.now)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    
    ---------------------
    --------------------
এখন আমরা চাই প্রতিটা পোস্টে লাইক দেওয়ার ব্যবস্থা থাকবে এবং কতটি লাইক দেওয়া হয়েছে সেটাও দেখাবে সাথে লাইক দেওয়ার পর লাইক undo করার জন্য আনলাইক অপশনও থাকবে। প্রতিটা পোস্টে লাইকের হিসাব রাখার জন্য আমরা users_like নামে আরেকটা ফিল্ড Post Model Class এ যুক্ত করবো- blog/models.py
class Post(models.Model):
    author = models.ForeignKey(User, on_delete=models.CASCADE,related_name='blog_posts')
    users_like = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name='posts_liked',blank=True)
    title = models.CharField(max_length=250)     
    body = models.TextField()
    publish = models.DateTimeField(default=timezone.now)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    
    ---------------------
    --------------------
users_like ফিল্ডটিতে ManyToManyField ব্যবহার করা হয়েছে কারণ একজন ইউজার একাধিক পোস্টে লাইক দিতে পারে আবার একটি পোস্টে একাধিক ইউজারের লাইক থাকবে। এর মাধ্যমে জ্যাঙ্গো দুটি মডেলেরই প্রাইমারী কি ব্যবহার করে intermediary join টেবিল তৈরি করে। ForeignKey এর মতো ManyToManyField ও many-t0-many manager প্রদান করে যার মাধ্যমে relative object এর মাধ্যমে ডাটা retrieve করা যায়, যেমন- post.users_like.all() বা user.posts_liked.all() ইত্যাদি।

STEP-02:

এখন post_details.html টেমপ্লেটের মধ্যে লাইক বাটন যোগ করা যাক – templates/post_details.html:
{% extends 'base/base.html' %}
..............................
..............................
 
{% with total_likes=post.users_like.count users_like=post.users_like.all %}
   <div class="image-info">
      <div>
         <span class="count">
            <span class="total">{{total_likes}}</span> like{{total_likes|pluralize}}
                <a href="#" data-id="{{post.id}}" data-action="{% if request.user in users_like %}un{%endif%}like" class="like btn btn-primary">
                {% if request.user not in users_like %}
                  Like 
                {% else %}
                  Unlike
                {% endif %}  
                </a> 
            </span>
       </div>
    </div>
{% endwith %}
  • প্রথমেই base.html টেমপ্লেটটি extend করা হয়েছে।
  • {%with%} ট্যাগ ব্যবহার করা হয়েছে দুটি ভ্যারিয়েবলের মধ্যে ভ্যালু স্টাের করে রাখার জন্য। total_likes ভ্যারিয়েবলটিতে মোট লাইকের সংখ্যা কুয়েরী করে রাখা হয়েছে এবং users_like ভ্যারিয়েবলটিতে লাইক দেওয়া ইউজাদের লিস্ট রাখা হয়েছে।
  • তারপর {{total_likes}} এর মাধ্যমে মোট লাইকের সংখ্যা দেখানো হয়েছে। total_likes|pluralize এর মাধ্যমে মোট লাইকের সংখ্যা একের অধিক হলে like এর শেষে s যুক্ত হবে।
  • data-id অ্যাট্রিবিউটের মধ্যে post এর id এবং data-action অ্যাট্রিবিউটের মধ্যে Like বা Unlike  স্ট্রিং স্টোর করে রাখা হয়েছে। এখানে if কন্ডিশনাল অপারেটর ব্যবহার করা হয়েছে যার মাধ্যমে চেক করা হয়েছে যে, বর্তমান ইউজার users_like লিস্টে আছে কিনা। যদি লিস্টের মধ্যে থাকে, সেক্ষেত্রে Unlike এবং যদি লিস্টের মধ্যে না থাকে তবে like স্ট্রিং স্টোর করা হবে। এই ডাটা পরবর্তীতে ajax অ্যাকশনের URL এর মাধ্যমে views ফাংশনের কাছে পাঠাবে এবং ডাটাবেস আপডেট হবে।
আমরা Ajax ফাংশনালিটি jQuery ফ্রেমওর্য়াকের মাধ্যমে সম্পন্ন করবো। এর জন্য প্রথমেই আমাদেরকে jQuery লোড করতে হবে। আমরা Google এর CDN থেকে jQuery লোড করবো ( অথবা https://jquery.com/ থেকে ডাউনলোড করে তা static ডিরেক্টরিতে যুক্ত করেও করতে পারি)। আমরা যেহেতু base.html টেমপ্লেটটি সকল টেমপ্লেটে extend করবো তাই jQuery CDN  টি আমরা base.html টেমপ্লেটের একদম নিচে </body> ট্যাগের পূর্বে যুক্ত করবো। base.html:
https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js

  $(document).ready(function(){
    {% block domready %}
    {% endblock %}
  });
  • জাভাস্ক্রিপ্ট কোড যুক্ত করার জন্য ট্যাগটি যুক্ত করা হয়েছে।
  • $(document).ready() হচ্ছে jQuery ফাংশন যা DOM (Document Object Model) কন্সট্রাক্টেড হওয়ার পর execute হয়। যখন কোন ওয়েব পেইজ লোড হয়, তখনই DOM কন্সট্রাক্ট হয়। কোন কোড এই ফাংশনের মধ্যে অন্তর্ভুক্ত করার মাধ্যমে এটা নিশ্চিত করা হয় যে,  যে HTML elements গুলো এই কোডের সাথে interact থাকবে সেগুলো load হবে।
  • যেহেতু base.html অন্য টেমপ্লেটে extend হবে, সেহেতু অন্য টেমপ্লেট থেকে এই ফাংশনের ভিতরে কোড লিখার domready নামে একটা block তৈরি করা হয়েছে। অন্য যেকোন টেমপ্লেট যেখানে এই base.html extend করা হবে, সেখানে domready block এর মধ্যে কোন কোড লিখলে সেটা এখানে execute হবে।

STEP-03:

এখন post_details.html থেকে প্রাপ্ত ডাটাগুলো (post id, action)  নিয়ে সার্ভার বা ডাটাবেস আপডেট করার জন্য  view ফাংশন  লিখতে হবে যেখানে ajax অ্যাকশনের সাথে ডাটাবেস আপডেট হবে। blog/views.py:
from django.contrib.auth.decorators import login_required
from django.http import JsonResponse
from django.views.decorators.http import require_POST

from .models import Post


@login_required
@require_POST
def post_like(request):
    post_id = request.POST.get('id')
    action = request.POST.get('action')
    if post_id and action:
        try:
            post = Post.objects.get(id=post_id)
            if action == 'like':
                post.users_like.add(request.user)
            else:
                post.users_like.remove(request.user)
            return JsonResponse({'status':'ok'})
        except:
            pass
  • এখানে আমরা দুটি ডেকোরেটর ব্যবহার করেছি, login_required এর মাধ্যমে লগইন ছাড়া ইউজারদেরকে প্রটেক্ট করা হয়েছে এবং  require_POST ডেকোরেটরটি, যদি  HTTP রিকুয়েস্টটি POST এর মাধ্যমে সম্পন্ন না হয় তবে HttpResponseNotAllowed রিটার্ন করবে।
  • post_id ভ্যারিয়েবলে get প্যারামিটারের মাধ্যমে Ajax রিকুয়েস্ট হতে প্রাপ্ত (step-6) ডাটার ‘id’ এর ভ্যালু এবং action ভ্যারিয়েবলে ‘action’ ডাটার স্ট্রিং স্টোর করে রাখা হয়েছে।
  • তারপর id থেকে কুয়েরী করে post অবেজক্টটি  খুঁজে বের করা হয়েছে।
  • action যদি Like হয় তবে add() মেথডের মাধ্যমে user কে ঐ post অবজেক্টের users_like ফিল্ডে যুক্ত করা হয়েছে এবং Unlike হলে remove() মেথডের মাধ্যমে ইউজারকে users_like লিস্ট থেকে রিমুভ করা হয়েছে।

STEP-04:

এখন উপরের view ফাংশনকে এক্সিকিউট করার জন্য একটি URL তৈরি করতে হবে। urls.py ফাইলটি edit করি- blog/urls.py:
path('like/',views.post_like,name='post_like'),

STEP-05:

Cross-Site Request Forgery (CSRF) in AJAX requests:

Django প্রতিটা POST রিকুয়েস্টের জন্য {% csrf_token %} ট্যাগের মাধ্যমে CSRF token চেক করে থাকে। কিন্তু প্রতিটা ajax রিকুয়েস্টর জন্য এটা কিছুটা অসুবিধাজনক।  এই কাজটাকে সহজ করার জন্য জ্যাঙ্গো প্রতিটা ajax রিকুয়েস্টের জন্য CSRF token থেকে প্রাপ্ত ভ্যালুর মাধ্যমে কাস্টম X-CSRF header যুক্ত করার ব্যবস্থা করে দিয়েছে। এই কাজটি দুটি পদ্ধতির মধ্য দিয়ে সম্পন্ন হয়-
  • প্রথমে ব্রাউজারের csrftoken cookies থেকে CSRF token সংগ্রহ করতে হবে।
  • প্রাপ্ত token কে X-CSRFToken header এর মাধ্যমে প্রতিটা রিকুয়েস্টের জন্য send করতে হবে।
উপরের কাজ দুটি করার জন্য নিচের কোডটুকু base.html এ যুক্ত করতে হবে- base.html:
  https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js

  https://cdn.jsdelivr.net/npm/[email protected]/src/js.cookie.min.js

  <script>
    var csrftoken = Cookies.get('csrftoken');
  function csrfSafeMethod(method) {
    // these HTTP methods do not require CSRF protection
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
  }
  $.ajaxSetup({
      beforeSend: function(xhr, settings) {
          if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
              xhr.setRequestHeader("X-CSRFToken", csrftoken);
          }
      }
  });
  $(document).ready(function(){
    {% block domready %}
    {% endblock %}
  });
  • প্রথমে পাবলিক CDN থেকে JS cookies plugin যুক্ত করা হয়েছে CSRF token পাওয়ার জন্য।
  • তারপর safe মেথডগুলোর জন্য একটি ফাংশন লিখা হয়েছে।
  • তারপর ajaxSetup ফাংশনের মধ্যে ajax request পাঠানোর পূর্বে চেক করা হয়েছে এটা safe মেথড (যেমন-GET) কিনা, যদি safe মেথড (যেমন- POST) না হয়, তবে csrftoken ভ্যালুর মাধ্যমে X-CSRFToken header যুক্ত করে দেওয়া হয়েছে।

STEP-06:

এখন আমাদেরকে post_details.html টেমপ্লেটে ajax অ্যাকশন সম্পন্ন করতে হবে, সেজন্য এই টেমপ্লেটের একদম শেষে domready block টি ব্যবহার করা হয়েছে।- templates/post_detials.html:
{% block domready %}
  $('a.like').click(function(e){
    e.preventDefault();
    $.ajax({
        type: "POST",
        url: "{% url 'blog:post_like' %}",
        data: {'id': $(this).data("id"),'action': $(this).data("action")},
        dataType: "json",
        success: function(data){
            var previous_action = $('a.like').data('action');

          // toggle data-action
          $('a.like').data('action', previous_action == 'like' ? 'unlike' : 'like');
          // toggle link text
          $('a.like').text(previous_action == 'like' ? 'Unlike' : 'Like');

          // update total likes
          var previous_likes = parseInt($('span.count .total').text());
          $('span.count .total').text(previous_action == 'like' ? previous_likes + 1 : previous_likes - 1);
        },
        error: function(res,e){
            alert("Something Went Wrong");
        }
    });
  });
{% endblock %}
  • প্রথমেই $(‘a.like’) সিলেক্টরের মাধ্যমে like ক্লাসের a ট্যাগটিকে সিলেক্ট করা হয়েছে।
  • তারপর ‘click’ ইভেন্ট এর জন্য একটি handler ফাংশন ডিফাইন করা হয়েছে। অর্থাৎ যখন ইউজার Like/Unlike বাটনে ক্লিক করবে তখন এই ফাংশনটি এক্সিকিউট হবে।
  • লিঙ্কের ডিফল্ট আচরণ avoid করার জন্য e.preventDefault() ব্যবহার করা হয়েছে।
  • তারপর ajax রিকুয়েস্ট ফাংশন লিখা হয়েছে।
  • type এর মধ্যে রিকুয়েস্টটি কোন ধরণের(POST/GET/PUT/DELETE) হবে সেটা দেওয়া হয়েছে।
  • url এর মাধ্যমে POST রিকুয়েস্টটি কোথায় সম্পন্ন হবে তা নির্ধারণ করে দেওয়া হয়েছে। এই লিঙ্কের মাধ্যমেই প্রাপ্ত ডাটা view ফাংশনে এক্সিকিউট হবে।
  • কোন ডাটাগুলো আমরা ঐ URL এর অ্যাড্রেসে পাঠাবো সেগুলো দিয়ে দেয়া হয়েছে।
  • data type কেমন হবে সেটা বলে দেওয়া হয়েছে। এখান ডাটা JSON ফরমেটে পাঠানো হয়েছে।
  • তারপর success এবং error নামে মূলত  callback() ফাংশন লিখা হয়েছে। অর্থাৎ যদি ajax রিকুয়েস্ট view ফাংশনে এক্সিকিউট হয়ে “ok” return করে তবে success ফাংশনটি এক্সিকিউট হবে।
  • তারপর previous_action এর মাধ্যমে পূর্বের Like or Unlike ভ্যালু নেওয়া হয়েছে।
  • এখন Like/Unlike এর উপর ভিত্তি করে data-action এর ভ্যালু পরিবর্তন করে দেওয়া হয়েছে। অর্থাৎ যদি পূর্বে Like দেওয়া হয়, তবে data-action এ Unlike ভ্যালু স্টোর হবে এবং link text এর ভ্যালুও পরিবর্তন হয়ে Unlike হয়ে যাবে পরবর্তী অপারেশন বা Unlike এর জন্য।
  • যেহেতু সম্পূর্ণ পেইজটি reload হচ্ছে না, সেজন্য server update হওয়ার পর সেই ডাটা total_likes ভ্যারিয়েবলে জমা হবে না। তাই Like/Unlike এর উপর ভিত্তি করে Total Likes এর সংখ্যাটা ১ বাড়িয়ে বা কমিয়ে তা দেখানো হয়।
ধন্যবাদ সাথে থাকার জন্য… 🙂 [If u find any inconsistency, please let me know]  
Uncategorized

ফ্রেমওয়ার্ক কি ? একটি ফেসবুক কথোপকথন

by , on
October 22, 2018

কয়েকদিন আগে ফেসবুক ম্যাসেন্জারে একজন ভাই আমাকে প্রশ্ন করেছিলেন,  “ফ্রেমওয়ার্ক কী?” তিনি কম্পিউটার সাইন্সের মানুষ নন, তাই তাঁর জানার কথাও না, ‘ফ্রেমওয়ার্ক কী’ ( যদিও অনেক CSE স্টুডেন্টরাও জানেনা )। অনেকেই আমার টাইমলাইনে জ্যাঙ্গো ফ্রেমওয়ার্ক নিয়ে অনেক লেখা দেখেন, কিন্তু বোঝেন না, ফ্রেমওয়ার্ক আবার কী!  তাদের উপকারের সার্থে, জনৈক ভায়ের অনুমতি সাপেক্ষে, নাম গোপন রাখার শর্তে, আমাদের কথপোকথন তুলে ধরা হল।

জনৈক ভাইঃ আসসালামু আলাইকুম, ভাইয়া আপনার কাছে কিছু প্রশ্ন ছিল আমার, জাষ্ট জানার জন্য।

আমিঃ ওয়ালাইকুমুচ্ছালাম।   জি ভাই, বলুন।

জনৈক ভাইঃ প্রোগ্রামিং সি, জাভা, পাইথন, এগুলোর নাম শুনেছি, সফটওয়্যার তৈরির হ্মেএে ব্যবহার হয় জানি, (আমার জানা মতে) কিন্তু জ্যাঙ্গো কি.? এটা দ্বারা কি কি করা যায়.? আর এটার শিখতে কি কি জানা লাগে.

আমিঃ  এটাকে বলে ফ্রেমওয়ার্ক। যে কাজগুলো বার বার করতেই হয় সেগুলোকে একসাথে করে একটা ফ্রেম তৈরী করা হয়, যাতে কাজ করতে সুবিধা হয়। এটা পড়ে দেখুন।

জনৈক ভাইঃ জি আমি পড়তেছি কিন্তু কিছু প্রশ্ন ঘুরপাক খাচ্ছে।

আমিঃ কি প্রশ্ন ?

জনৈক ভাইঃ ফ্রেমওয়ার্ক জিনিসটাই বুঝলাম না, সেটা কী ? 😟

আমিঃ  আপনি কী প্রগ্রামিং জানেন ? 

জনৈক ভাইঃ না ভাই

আমিঃ তাহলে আগে প্রগ্রামিং শিখুন, ধীরে ধীরে বুঝতে পারবেন। 

জনৈক ভাইঃ সরি ভাই আসলে আমি মানছি আমি জানি না এটা, কিন্তু ফেমওয়ার্ক জিনিসটা আসলে কী, সেটার ক্লিয়ার কনসেপশন আপনার কাছ থেকে জানতে চাচ্ছিলাম।

আমিঃ আমরা অনেক কাজেই ফ্রেম ব্যাবহার করি, যেমন, ইট তৈরী করতে ফ্রেম ব্যাবহার করা হয়।  কারন , প্রত্যেকটি ইটের জন্য তো আলাদাভাবে সাইজ, ডিজাইন, লেখা সম্ভব না।
তাই যে কাজগুলো সব ইটেই করতে হবে, সেই জিনিসগুলোর জন্য ফ্রেম তৈরী করা হয়

সফটওয়ারেও কিছু জিনিস আছে যা অধিকাংশ সফটওয়ারেই ব্যাবহার করতে হয়।যেমন আমরা ব্রাউজারে কোন লিঙ্ক দিলে সেটা সার্ভারে রিকুয়েষ্ট পাঠায়, সার্ভার সেটাকে গ্রহন করে, সেই অনুয়ায়ী হিসাব করে, সর্বশেষে একটা এইচটিএমএল কে আবার ব্রাউজারের কাছে পাঠায়।

এই প্রত্যেক ধাপের জন্য অনেক কোড লিখতে হয়। 
তাই কিছু ইন্জিনিয়ারা মনে করলেন, যে কাজগুলো প্রত্যেক সফটওয়ারেই লাগছে, বার বার একই কোড ব্যবহার না করে সেগুলোকে একটা ফ্রেমের মধ্যে নিয়ে আসি। যাতে আমি ওই ফ্রেমটাকে ব্যাবহার করে সহজেই কাজগুলো করে ফেলতে পারবো।


জনৈক ভাইঃ 😍

জনৈক ভাইঃ যাক ভাই বুঝেছি এখন।  আরেকটু জালাবো ভাই, জ্যাঙ্গো শেখার জন্য প্রথম থেকে কি কি শিখতে হবে ?

আমিঃ প্রথমে পাইথন ভাল জানতে হবে, পাইথন দিয়ে কিছু প্রবলেম সলভ  করতে হবে এবং কিছু ব্যাসিক এলগরিদম শেখার পর জ্যাঙ্গো শুরু করতে পারেন।

জনৈক ভাইঃ এসবের জন্য কী কনফিগারেশন এর পিসি লাগবে.?

আমিঃ মোটামুটি কনফিগারেশনের হলেই হবে। 

জনৈক ভাইঃ জ্যাঙ্গোর কাজ শিখতে প্রথমে কি শিখতে হবে?

আমিঃ পাইথন। 

জনৈক ভাইঃ কিভাবে শুরু করব, কি কি লাগবে.? আমার তো ভাই win7 /32bit Ram 2gb ।

আমিঃ  সমস্যা নেই, শুরু করে দিন।  http://hukush-pakush.com/ থেকে শুরু করতে পারেন।

এরপর আমাদের কথোপকথন অন্য দিকে মোড় নিলো …….

Uncategorized

ইমেল ভেরিফিকেশনের মাধ্যমে জ্যাঙ্গোতে ইউজার রেজিষ্ট্রেশন

by
, on
September 15, 2018

জ্যাঙ্গোতে ইমেল ভেরিফিকশেনর মাধ্যমে কিভাবে ইউজার রেজিষ্ট্রেশন সম্পন্ন করা যায়, এই টিউটোরিয়ালটিতে আমরা সে বিষয়টি শেখার চেষ্টা করবো।

Step-01:

প্রথমেই ধরে নিই যে, mysite নামে আমাদের একটি প্রজেক্ট রয়েছে যেখানে account নামে একটি অ্যাপস আছে।

ভেরিফিকেশন ইমেল পাঠানোর কাজটি করার জন্য প্রথমেই settings.py ফাইলে যেয়ে ইমেল হোস্ট সার্ভারটি সেট করে দিতে হবে। আমরা মেইল পাঠানোর কাজটি gmail smtp(simple mail transfer protocol) সার্ভার ব্যবহার করে সম্পন্ন করবো। (ইমেল পাঠানোর কাজটা আমরা sendgrid ব্যাহার করেও করতে পারি, বিস্তারিত)

Uncategorized

url এর খুটিনাটি

by , on
September 11, 2018

আসসালামুয়ালাইকুম,
গত পর্বে localhost:8000/hi ইউআরএল এ ব্রাউজ করলে “hello, how are you?” লেখাটি দেখেছিলাম। এখন আমরা  response মেসেজটিকে বিভিন্নভাবে আপডেট করব।

banglaidj/banglaidj/views.py

def hello(request):
    name = "Harun"
    msg = "Hello {}, how are you?".format(name)
    return HttpResponse(msg)

এখন ম্যাসেজটি নাম সহ দেখাচ্ছে। কিন্তু এখনো নামটি স্ট্যাটিক আছে। আমরা চাই, নামটি url এর মাধ্যমে নিব। localhost:8000/hi/hasib দিলে আমাকে দেখাবে “hello hasib, how are you” ।

banglaidj/banglaidj/urls.py

urlpatterns = [
    path('admin/', admin.site.urls),
    path('hi/<name>', hello)
]

এখানে url এ প্যারামিটার যুক্ত করা হয়েছে  <> দ্বারা, যা প্যারামিটার বোঝায়। hi/ এর পর যে কোন স্ট্রিং দিলে তা name ভ্যারিয়েবলের মধ্যে initialize হবে এবং hello ফাংশনে প্যারামিটারের মান ( value)  পাঠিয়ে দিবে। এখন আমরা hi/harun, hi/hasib, hi/abdullah, hi/abc এভাবে যে কোন url লিখতে পারব।

url যেহেতু অতিরিক্ত প্যারামিটারের ভ্যালু hello ফাংশনের কাছে পাঠিয়ে দিয়েছে, hello ফাংশনটিকে এখন ভ্যালুটি গ্রহন করতে হবে। def hello(request, name), এভাবে প্যারামিটারের মাধ্যমে ফাংশনের মধ্যে কোন ডাটা গ্রহন করা হয়।
মনে রাখতে হবে, ইউআরএল এবং ফাংশনের প্যারামিটার একই নামে হতে হবে।

banglaidj/banglaidj/views.py

def hello(request, name):
    msg = "Hello {}, how are you?".format(name)
    return HttpResponse(msg)

<name> সবসময় ইউআরএল এ স্ট্রিং ইনপুট নেবে, Integer ভ্যালু ইউআরএল এ ইনপুট নিতে চাইলে
<int: variable_name> দিতে হবে।

banglaidj/banglaidj/views.py

from django.http import HttpResponse

def hello(request, name):
    msg = "Hello {}, how are you?".format(name)
    return HttpResponse(msg)

def show_page(request, page_no):
    msg = "Page No: {}".format(page_no)
    return HttpResponse(msg)

banglaidj/banglaidj/urls.py

from django.contrib import admin
from django.urls import path
from .views import hello, show_page


urlpatterns = [
    path('admin/', admin.site.urls),
    path('hi/<name>', hello),
    path('page/<int:page_no>', show_page)
]

অনুশীলনী

banglaidj/banglaidj/views.py

# store demo users data
user = {
    'user_name':'harun',
    'password':'password123'
    }

def check_user(request, username, password):
    if user['user_name'] == username:
        if user['password'] == password:
            return HttpResponse("Logged in successfully")
        else:
            return HttpResponse("Incorrect password! Try again.")
    else:
        return HttpResponse("Invalid username")

banglaidj/banglaidj/urls.py

from django.contrib import admin
from django.urls import path
from .views import hello, show_page, check_user


urlpatterns = [
    path('admin/', admin.site.urls),
    path('hi/<name>', hello),
    path('page/<int:page_no>', show_page),
    path('user/<username>/<password>', check_user)
]

 

<< আগের পোষ্ট           পরের পোষ্ট >>

Uncategorized

প্রথম url, হ্যালো কেমন আছেন ?

by , on
September 10, 2018

আসসালামুয়ালাইকুম,
গত পর্বে আমরা “localhost:8000”url এ একটি ড্যামো সাইট দেখেছিলাম। এখন থেকে আমরা নিজেরা নতুন নতুন url তৈরী করব যা ব্রাউজারে প্রবেশ করালে চমৎকার কিছু কাজ আমাদের সামনে হাজির করবে। তো, প্রথমে ছোট্ট একটি url তৈরী করা যাক…

লক্ষ

বাংলায় জ্যাঙ্গো টিউটোরিয়াল সিরিজে আজকের পর্বে আমাদের লক্ষ, “localhost:8000/hi” ইউআরএল তৈরী করা যা ব্রাউজারে প্রবেশ করালে “Hello, how are you?” লেখাটি দেখাবে।

Url তৈরীঃ

প্রজেক্ট ডিরেক্টরির মধ্যে একই নামে আরেকটি ডিরেক্টরী আছে যেখানে urls.py ফাইল আছে। প্রজেক্টের সকল Url এই ফাইলের মধ্যে লেখা হয়। এখনে urlpatterns নামে একটি লিষ্ট আছে যার মধ্যে সকল url এর প্যাটার্ন তৈরী করা হয়।

path() ফাংশনের প্রথম প্যারামিটারে url এর গঠন দেয়া হয়। অর্থাৎ, ইউআরএল এর চেহারা যদি হয় ‘localhost:8000/hi’ তাহলে path ফাংশন লেখা হবে, path(‘hi’), যদি চেহারা  হয়

localhost:8000/home’ তাহলে path ফাংশন লেখা হবে, path(‘home’)

ইউআরএল টি ব্রাউজারে প্রবেশ করালে যে কাজ সংঘটিত হবে, সার্ভার যে কাজ করবে, ব্রাউজার যা প্রদর্শণ করবে, সবকিছু একটি ফাংশনের মধ্যে লেখা হয়, যাকে জ্যাঙ্গো এর ভাষায় view ফাংশন বলে। path() ফাংশনের ২য় প্যারামিটারে ওই ফাংশনকে call করা হয়। যেমন, আমরা যদি hello ফাংশনের মধ্যে কাজগুলো করি তাহলে তাহলে path ফাংশন লেখা হবে, path(‘hi’, hello) অর্থাৎ, ব্রাউজারে ‘localhost:8000/hi’ প্রবেশ করালে hello ফাংশনটি কল হবে।

View ফাংশন তৈরীঃ

from django.contrib import admin
from django.urls import path
from django.http import HttpResponse

def hello(request):
    return HttpResponse("Hello, how are you?")

urlpatterns = [
    path('admin/', admin.site.urls),
    path('hi/', hello)
]

ব্রাউজার, সর্ভারের কাছে একটি request পাঠাবে, যাকে বলে HttpRequest Hello ফাংশনটি সেই request কে তার প্যারামিটারের মধ্যে দিয়ে গ্রহন করবে। এখন সার্ভার, ব্রাউজারের পাঠানো HttpRequest কে প্রসেস করে, একটি স্ট্রিং কে HttpResponse হিসেবে ব্রাউজারে পাঠাবে। HttpResponse একটি ফাংশন, যাকে ইম্পোর্ট করতে হবে django.http মডিউল থেকে।

এখন সার্ভার রান থাকা অবস্থায় ব্রাউজারে লিখুন ‘localhost:8000/hi’ এবং আপনার প্রত্যাশিত ফলাফল দেখে নিন।

আমরা সহজভাবে বোঝার জন্য view ফাংশন এবং url একই ফাইলে লিখেছি, কিন্তু এটা অনুচিত। ভিন্ন ধরণের কোড আলাদা আলাদা ফাইলে লেখা উত্তম।
তাই আমরা view ফাংশনটিকে( hello() ) views.py নামে ভিন্ন একটি ফাইলে নিখে ফেলি। যেখানে urls.py আছে, একই ডিরেক্টরিতে views.py নামে ফাইল তৈরী করি।

banglaidj/banglaidj/views.py

from django.http import HttpResponse

def hello(request):
    return HttpResponse("Hello, how are you?")

banglaidj/banglaidj/urls.py

from django.contrib import admin
from django.urls import path
from .views import hello  # import view function from views.py

urlpatterns = [
    path('admin/', admin.site.urls),
    path('hi/', hello)
]

<<আগের পোষ্ট                পরের পোষ্ট >>

Uncategorized

virtualenvwrapper কি এবং কেন ব্যবহার করবেন ?

by , on
August 13, 2018

আসসালামুয়ালাইকুম,
আশা করি আপনারা জ্যাঙ্গো বেশ ভালোই শিখে ফেলেছেন, এবং মজায় মজায় কিছু প্রজেক্ট ও করে ফেলেছেন।  

virtualenvwrapper কি ?


আপনারা জানেন
, জ্যাঙ্গো প্রজেক্ট করার সময়, প্রজেক্টের বিভিন্ন মডিউলের ভার্সন ম্যানেজ করার জন্য  virtualenvironment ব্যাবহার করা হয়। কিন্তু যখন অনেকগুলো প্রজেক্ট করা হয়ে যায়, তখন ভিন্ন ভিন্ন প্রজেক্টের জন্য virtualenvironment ও হয় একাধিক। আলাদা আলাদা স্থানে থাকা virtualenvironment গুলো ম্যানেজ করা কিছুটা বিরক্তিকরও বটে। এই সমস্যা থেকে মুক্তি পাওয়ার জন্য চমৎকার একটি মডিউল হচ্ছে virtualenvwrapper । এর সাহায্যে আপনার সবগুলো  virtualenvironment কে একটিমাত্র ডিরেক্টরীতে রাখতে পারবেন এবং খুবই সহজভাবে অল্প কিছু কমান্ডের সাহায্যে আপনি virtualenvironment তেরী ও ম্যানেজ করতে পারবেন।

ইন্সটল করুন


আপনার PIP3  ইন্সটল করা না থাকলে করে ফেলুন

sudo apt-get install python3-pip

একইসাথে virtualenvwrapper ও ইন্সটল করুন

sudo pip3 install virtualenvwrapper

এখন shell startup ফাইলে ( .bashrc ) কিছু কমান্ড লিখে দিতে হবে । .bashrc ফাইলটি টার্মিনাল  এডিটরে খুলুন। ( আমি nano এডিটর ব্যাবহার করব

nano  ~/.bashrc

আপনার টার্মিনালে .bashrc ফাইলটি খুলবে। একেবারে শেষে নিচের লাইনগুলো যোগ করুন

export WORKON_HOME="$HOME/.virtualenvs"
export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
source /usr/local/bin/virtualenvwrapper.sh

nano এডিটরে ফাইল সেভ করে বের হয়ে আসতে  Ctrl + X  অতঃপর Y চাপুন । 
.bashrc
ফাইলটি রিলোড লিতে লিখুন 

source ~/.bashrc

তৃতীয় লাইনে virtualenvwrapper.sh এর লোকেশন যুক্ত করা হয়েছে। অনেকের এই লাইনে ইরর দেখাতেও পারে ( সম্ভাবনা খুব কম ) । যদি ফাইলটি পাচ্ছে না এমন কোন ইরর দেখায় তাহলে আপনার virtualenvwrapper.sh কোন লোকেশনে আছে দেখতে লিখুন

which virtualenvwrapper.sh

ব্যাস, আপনার virtualenvwrapper ইন্সটল শেষ, এখন মনের সুখে ব্যাবহার করুন। 

ব্যাবহার

virtual environment তৈরী করতে টার্মিনালে লিখুন,

mkvirtualenv testenv1

testenv1 নামে একটি virtualenvironment তৈরী হবে যটি থাকবে আপনার হোম এর  .virtualenvs ডিরেক্টরীতে। 
আপনার তৈরী করা ভার্চুয়ার এনভাইরনমেন্ট গুলো দেখতে লিখুন 

workon

কোন নির্দিষ্ট এনভাইরনমেন্ট একটিভ করতে লিখুন  workon your_env_name. যেমন,

workon testenv1

deactivate করতে লিখুন 

deactivate

কোন একটি Environment মুছে ফেলতে লিখুন rmvirtualenv env_name

rmvirtualenv testenv1

 

Uncategorized

Create Custom Template Tags in Django – Bangla

by
, on
August 1, 2018

এই টিউটোরিয়ালে যেসব বিষয়গুলো থাকছে-
  •  ব্লগের মোট পোস্ট সংখ্যা দেখানোর জন্য custom template tag ।
  • ব্লগের  latest post গুলো দেখানোর জন্য custom template tag।

“বেশি করে আলু খান, ভাতের উপর চাপ কমান।” এই টাইপ একটা স্লােগান বাংলাদেশে কোন একসময় খুব প্রচারিত হতো।  অর্থাৎ একটার উপর থেকে চাপ কমানোর জন্য আরেকটার বিকল্প ব্যবহার।

জ্যাঙ্গোতে আমরা সাধারণত বিভিন্ন কুয়েরী চালিয়ে কোন ডাটাকে views.py থেকে কনটেক্সট ডাটা হিসেবে টেমপ্লেটে পাঠাই। সেক্ষত্রে আমাদের অ্যাপসের ফাংশানালিটি যদি বেশি হয়, তবে views.py ফাইলে কোডের লাইন সংখ্যা বেড়ে যায়।

views.py ফাইলের উপর থেকে চাপ কমানোর জন্য ছোটখাটো কিছু কুয়েরী বা অপারেশন আমরা custom template tags এর মাধ্যমে তৈরি করার চেষ্টা করবো।

জ্যাঙ্গো কাস্টম টেমপ্লেট ট্যাগ তৈরি করার জন্য  simple_tags এবং inclusion_tags নামে দুইটা ফাংশনালিটি প্রদান করে।

  • simple_tags: string বা কাঙ্খিত রেজাল্ট return করে।
  • inclusion_tags: render template রির্টান করে।

এখন মনে করি আমাদের blog নামে একটা এপস আছে যেখানে Post নামে একটি model ক্লাস রয়েছে। আমরা চাই আমাদের blog এ যতগুলো পোস্ট আছে তা কাউন্ট করে টেমপ্লেটে প্রদর্শন করতে। এর জন্য আমরা total_post নামে একটা custom template tag লিখবো।

এই কাজটা করার জন্য blog ডিরেক্টরীতে templatetags নামে একটা নতুন ফোল্ডার তৈরি করি। এই ফোল্ডারের ভিতের __init__.py এবং blog_tags.py নামে দুটি নতুন ফাইল তৈরি করি-

templatetags/
   __init__.py
   blog_tags.py

এখন blog_tags.py ফাইলটিকে ওপেন করে নিচের কোডটুকু লিখা যাক:

from django import template
from blog.models import Post
register = template.Library()
@register.simple_tag
def total_post():
    return Post.objects.count()
  • প্রথমেই django এর template মডিউলকে import করা হয়েছে।
  • সবগুলো পোস্ট কাউন্ট করার জন্য model  থেকে Post মডেল ক্লাস import করা হয়েছে।
  • কাষ্টম টেমপ্লেট ট্যাগটিকে জ্যাঙ্গোর টেমপ্লেট লাইব্ররীতে যুক্ত করার জন্য register নামে template.Library() এর instance তৈরি করা হয়েছে।
  • তারপর total_post() নামে একটি মেথড তৈরি করা হয়েছে এবং এটাকে simple tag হিসেবে বিবেচনা করার জন্য @register.simple_tag ডেকোরেটর ব্যবহার করা হয়েছে।

মেথডের নামটিই কাস্টম ট্যাগ এর নাম হিসেবে ব্যবহার করা হবে। ট্যাগের অন্য কোন নাম দিতে চাইলে simple tag ডেকোরেটরের ভিতরে name প্যারামিটার ব্যবহার করে ট্যাগের ভিন্ন কোন নাম দেওয়া যাবে। যেমন- @register.simple_tag(name=’my_tag’)

  • তারপর Post মডেলে যতগুলো পোস্ট অবজেক্ট আছে সবগুলো গণনা করে return করা হয়েছে।

এরপর কাজ হবে custom tags এর  ফাইলটা অর্থাৎ blog_tags.py কে base template অথবা যে template এর মধ্যে আমরা কাস্টম ট্যাগ ব্যবহার করবো সেখানে  load করা অর্থাৎ টেমপ্লেটের শুরুতেই –

{% load blog_tags %}

এই অংশটুকু যোগ করতে হবে। তারপর template এর যেখানে আমরা total post এর সংখ্যা দেখাতে চাই সেখানে –

{% total_post %}

এই অংশটুকু যোগ করলেই মোট পোস্টর সংখ্যাটা দেখাবে।

Custom Tag For Latest Post:

এখন আমরা আরেকটি কাস্টম ট্যাগ বানাবো যার মাধ্যমে যেন আমরা  latest post  খুঁজে বের করতে পারি। এটা করার জন্য আমরা inclusion_tag ব্যবহার করবো (simple_tag ব্যবহার করে নিজেরা চেষ্টা করে দেখতে পারেন)।

blog_tags.py ফাইলটা edit করা যাক-

from django import template
from blog.models import Post

register = template.Library()

@register.simple_tag
def total_post():
    return Post.objects.count()

@register.inclusion_tag('blog/post/latest_posts.html')
def show_latest_posts(count=5):
    latest_posts = Post.objects.order_by('-publish')[:count]
    return {'latest_posts':latest_posts}
    • show_latest_posts নামে নতুন আরেকটা মেথড ব্যবহার করা হয়েছে। যেখানে count  নামে একটা প্যারামিটার নেওয়া হয়েছে ডিফল্টভাবে যার ভ্যালু 5   । যখন show_latest_posts ট্যাগটি টেমপ্লেটে ব্যবহার করা হবে তখন কতগুলো latest post দেখাতে চাই সেটা নির্ধারণ করে দেওয়ার জন্য count প্যারামিটারটি ব্যবহার করা হয়েছে।
    • @register.inclusion_tag ডেকোরেটরের মধ্যে নতুন একটা টেমপ্লেট latest_posts.html উল্লেখ করা হয়েছে। এর ফলে {% show_latest_post %} ট্যাগটি latest_posts.html টেমপ্লটেকে  কাঙ্খিত টেমপ্লটে(যেই template এ এই ট্যাগ ব্যবহার করা হবে) render করবে।
    • Post মডেল থেকে কুয়েরী চালিয়ে latest publish date অনুযায়ী সাজিয়ে count এর সমান সংখ্যক পোস্টকে latest_posts ভ্যারিয়বলে রাখা হয়েছে।
    • মেথডটি dictionary টাইপ ডাটা রিটার্ন করেছে (context ডাটা হিসেবে) যা আমরা render কৃত template (latest_posts.html) এ ব্যবহার করতে পারবো।

     

এখন latest_posts.html টেমপ্লটেকে edit করা  যাক:

<ul>
  {% for post in latest_posts  %}     
  <li>
     <a href="{{post.get_absolute_url}}">{{post.title}}</a>
  </li>
  {% endfor %}
</ul>

এখানে show_latest_posts মেথড যে context ডাটা(latest_posts) রির্টান করেছিলো, সেটা ব্যবহার করে unordered list এর মধ্যে for লুপ এর মাধ্যমে প্রতিটা পোস্টের title প্রদর্শন করা হয়েছে, সাথে প্রতিটা টাইটেলের সাথে তাদের details এর লিঙ্ক যুক্ত করে দেওয়া হয়েছে।

এখন আমরা যেকোন template এর মধ্যে যে স্থানে {% show_latest_posts  %} ট্যাগটি ব্যবহার করবো, সেখানে latest_posts.html  টেমপ্লটেটি render হবে অর্থাৎ সেখানে latest post গুলো unordered list আকারে দেখাবে। latest post এর সংখ্যা নির্ধারণ করে দেওয়ার জন্য show_latest_posts ট্যাগটির পরে কাঙ্খিত সংখ্যা উল্লেখ করতে হবে।

যেমন- যদি latest চারটি পোস্ট দেখাতে চাই তবে-

{% show_latest_posts  4  %}

আশা করি সবাই বুঝে গেছেন কিভাবে কাস্টম ট্যাগ ব্যবহার করে views.py এর চাপ কিছুটা কমাতে পারি।

ধন্যবাদ সাথে থাকার জন্য…. 🙂

[If you find any inconsistency, please let me know]