Link Shortener by Django 1

Create Link Shortener by Django : Django base url Code

প্রজেক্ট: লিঙ্ক শর্টেনার তৈরি

(আলোচনা পর্ব)

প্রসেসট/লজিকঃ 

লিঙ্ক শর্টেনার তৈরি করার আগে একটা লিঙ্ক শর্টেনার কিভাবে কাজ করে তার প্রসেসটা/লজিকটা বুঝতে হবে. যেমন-

  • https://cutt.ly নামক লিঙ্ক শর্টেনার ওয়েবসাইট এর মধ্যে প্রবেশ করি। 
  • https://cutt.ly ওয়েবসাইটটির বক্সের মধ্যে যেকোন সাইটের লং url’s paste করলে তা https://cutt.ly/ এর পর কিছু রেনডম String/ডিজিট জেনারেট করবে অর্থাৎ শর্ট ইউ আর এল জেনারেট হবে। উদাহরণ-  https://cutt.ly/TKfmW91
  • এ রেনডম String/ডিজিট গুলোই আমাদের প্রথমত জেনারেট করতে হবে।
  • এরপর, জেনারেট হওয়া short url টা ডাটাবেজে সংরক্ষণ করতে হবে। ফাইনালি পরবর্তী কাজ করতে হবে যেমন ইউজার যখন ওই শর্ট ইউ আর এল টিতে প্রবেশ করবে তখন তা রিডাইরেক্ট করে মেইন লং ইউ আর এল এর মধ্যে প্রবেশ করবে।

Random String Generator Function তৈরিঃ

তো, এই প্রজেক্ট এর শুরুতে আমরা Random String Generator Function তৈরি করা শিখে ফেলবো.

Random String এর উদাহরণ- 

import random
import string

letters = string.ascii_letters
digits = string.digits

# print(letters)
# print(digits)

character = letters+digits
# print(character)

# sample_character = random.sample(character, 4)
# print(sample_character)

sample_character = ''.join(random.sample(character, 4))
print(sample_character)

যা করব- Random String Generator Function তৈরিঃ

import random
import string

def sample_generator():  
    letters = string.ascii_letters
    digits = string.digits
    character = letters+digits
    sample_character = ''.join(random.sample(character, 4))
    return sample_character

 

প্রজেক্ট তৈরির সম্পূর্ণ গাইড লাইন

Link Shortener তৈরি করার জন্য সবার আগে কিন্তু কাজগুলো করা থাকতে হবে:

ধাপ 1- স্টার্টিং কাজগুলো

এক্ষেত্রে, প্রথম ধাপের কাজগুলো-

  • ১। virtual environment তৈরি করাযে ফোল্ডারে virtual environment create করতে চান ওই ফোল্ডারে যান। উদাহরণস্বরূপ কমান্ডটি- cd Documents/Django || ওই ফোল্ডারে ভার্চুয়াল এনভারমেন্ট ক্রিয়েট করুন এই কমান্ডটি দিয়ে- virtualenv blogenv2

আর, উইন্ডোজ পিসি ইউজার হলে যে কমান্ড দিবেন-

python -m venv blogenv2
  • ১.২। virtual environment টা activate করা: এখন, যে ভার্চুয়াল এনভারমেন্ট ক্রিয়েট করেছেন ওই ফোল্ডারে ডুকুন কমান্ড দিবে– cd blogenv2 || এবার ভার্চুয়াল এনভারমেন্ট একটিভ করার কমান্ড কোড দিন – source bin/activate (তাহলে বাম পাশে ১ম বন্ধনীতে active virtualenv নাম দেখতে পাবেনব্যাস, হয়ে গেল। ((ফোল্ডার ডিরেক্ট লোকেশনঃ cd Documents/Django/blogenv2)))

আর, উইন্ডোজ পিসি ইউজার হলে যে কমান্ড দিবেন-

source env/Scripts/activate
  • ২। Django Project ইনস্টল ও তৈরি করা: এবার cd blogenv2 ফোল্ডারে থাকা অবস্থায় Django install করার কমান্ডঃ  pip install django বা sudo pip install django || এবার Django তে প্রজেক্ট ক্রিয়েট করার কমান্ডঃ django-admin startproject  link_shortener
  • ২.২।   Django Project টা activate করা:  , এখন, কাজের সুবিধার্থে এই প্রজেক্ট টপে থাকা প্রথম ফোল্ডারের নাম core থেকে চেঞ্জ করে src দেব, তখন ওই ফোল্ডারে ডুকতে কমান্ড দিব- cd src অর্থাৎ এভাবে করে src ফোল্ডারের ভেতরে যে ফোল্ডারে Manage.py আছে অর্থাৎ core আছে সে ফোল্ডারে ডুকুন। এখন প্রজেক্ট সার্ভার রান করার কমান্ডো দিন:  python manage.py runserver ব্যাস,এখন http://127.0.0.1:8000 এ ঢুকলেই দেখবে যে django সাকসেসফুলি রান হয়ে প্রজেক্ট স্টার্ট হবে.  (((ফোল্ডার ডিরেক্ট লোকেশনঃ cd Documents/Django/blogenv2/src)))
  • ৩। App টা তৈরি করাএরপর cd Documents/Django/blogenv2/src এ থাকা অবস্থান দিয়ে python manage.py startapp shortener কমান্ড দিয়ে app run করতে পারবেন.

তবে এক্ষেত্রে,

  • Mac ইউজারদের ক্ষেত্রে যেন আগ থেকে Mac এর মধ্যে নিচের এই ৩টি ইন্সটল করা যেন থাকেঃ ১। পাইথন- brew install python3 ২। পিপ – sudo easy install pip ৩। ভার্চুয়াল এনভারনমেন্ট – sudo pip install virtualenv || এগুলো আগ থেকে ইন্সটল করা আছে কিনা তা দেখার কমান্ড/উপায়ঃ python3 –version, pip3 –version
  • আর, Windows ইউজার হলে gitbash (git-scm.com থেকে) Download & install করা। এরপর, কম্পিউটারের যে ফোল্ডারে প্রজেক্ট/কাজ তৈরি করবেন ঐ ফোল্ডারে ডুকে মাউসের রাইট অপশন থেকে Git bash here এ ক্লিক করার মাধ্যমে git bash ওপেন করুন ও উপরোক্ত নিয়মে(প্রথম ধাপে স্টার্টিং কাজ) কমান্ড দেয়ার মাধ্যমে প্রজেক্ট শুরু করা।

ধাপ ২ – বেসিক টেস্টিং

 এখন, দ্বিতীয় ধাপের কাজগুলো প্রথমত- টেস্টিং

➡️# এরপর src ফোল্ডারের ভেতর templates নামক একটি ফোল্ডার তৈরি করব। সেখানে index.html ফাইল তৈরী করে নিন। সে ফাইলে আপাতত লিখি-

<h1> hellow world </h1>

 

➡️ এখন, link_shortener/settings.py এর ৩৩ নং লাইন থেকে শুরু হওয়া 40 নাম্বার লাইনে installed apps লিস্টে শেষে ‘shortener’ দিয়ে এপস এর নাম যুক্ত করব।

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'shortener', # এই লাইন নতুন ভাবে যুক্ত করা হয়েছে 
]

➡️# link_shortener/settings.py ফাইলে প্রবেশ করুন । এরপর templates লিস্ট ( ৫৮ নং লাইনে ) DIRS এর ভেলুর ভিতরে লিখুন BASE_DIR / ‘templates’ । তাহলে কোড নিচের মত দেখাবে-

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR / 'templates'],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

➡️# blogenv2/src/link_shortener/urls.py ফাইল গিয়ে path এর পর কমা দিয়ে include ফাংশনকে ইম্পোর্ট করুন । আর. urlpattern লিস্টে নতুন করে path(”, include(‘shortener.urls’)) যুক্ত করুন । এখানে shortener হচ্ছে এপস এর নাম আর urls হচ্ছে সেখানকার ফাংশনের নাম।

from django.contrib import admin
from django.urls import path, include

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

 

 

➡️# এরপর, এপস(shortener) ফোল্ডার এর ভেতর গিয়ে সেখানে urls.py নামে একটি নতুন ফাইন তৈরি করে নেব এবং ওই ফাইল এর ভেতর গিয়ে admin অংশের দুই জায়গাই লেখাটুকু বাদ দিয়ে, বাকি path অংশটুকু কিছুটা মডিফাই করে, view import সংযোজন করব। অর্থাৎ ফাইনালি src/shortener/urls.py ফাইল code যেমন দেখাবে

from django.urls import path, include
from . import views

urlpatterns = [
    path('', views.home_view, name = 'home' )
]

 

➡️# এখন, src/shortener/views.py ফাইল আপাতত নিম্নরূপ সেটিং করবে-

from django.shortcuts import render

# Create your views here.

def home_view(request):
    context = {}
    return render(request,'index.html', context)

এখন, কমান্ড এর মাধ্যমে src ফোল্ডারে গিয়ে python manage.py runserver দিবে। ব্যাস, এখন যেকোনো ব্রাউজারে  htp://localhost:8000 বা  http://127.0.0.1:8000 এ ঢুকলেই দেখবে যে django সাকসেসফুলি রান হয়ে প্রজেক্ট স্টার্ট হবে।

ধাপ 3 – টেস্টিং গুলো আপডেট করে ফাইনালিজম করা

 এখন, দ্বিতীয় ধাপের কাজগুলো দ্বিতীয়ত-  

➡️# এখন, ফাইনালি, src/templates/index.html ফাইলটা আপডেট করে নিম্নরূপ/এমন বানাব- 

<!doctype html>
<html lang="en">
  <head>
    <!-- Required meta tags -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <!-- Bootstrap CSS -->
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">

    <title>Hello, world!</title>
  </head>
  <body>
    <nav class="navbar navbar-expand-lg navbar-dark bg-dark">
        <div class="container">
          <a class="navbar-brand" href="#">Navbar</a>
          <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
            <span class="navbar-toggler-icon"></span>
          </button>
          <div class="collapse navbar-collapse" id="navbarNav">
            <ul class="navbar-nav">
              <li class="nav-item">
                <a class="nav-link active" aria-current="page" href="#">Home</a>
              </li>
              <li class="nav-item">
                <a class="nav-link" href="#">Features</a>
              </li>

            </ul>
          </div>
        </div>
      </nav>

<div class="container my-5 w-75">
    <form action="" method="post"> {% csrf_token %}
        <div class="mb-3">
            <label for="long_url">Paste your long url here</label>
            <input type="text" class="form-control" id="long_url" name="long_url" placeholder="https://...">
        </div>
        <div class="text-center">
            <input type="submit" value="Create Now" class="btn btn-lg btn-danger">
        </div>
    </form>

{% if link %}
    <div class="row my-5 ">
        <div class="col">
            Main Url: <a href="{{link.long_url}}">{{link.long_url}}</a>
        </div>
    
        <div class="col">
            Short Url: <a href="/{{link.code}}">http://localhost:8000/{{link.code}}</a>
        </div>
    </div>
  {% endif %}

</div>

    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous"></script>
  </body>
</html>

তাহলে এরকম দেখতে পাবো- https://prnt.sc/v6FM_SLpMk48

➡️#  তে src/shortener/models.py ফাইলটা (১ম)আপডেট করে নিম্নরূপ/এমন বানাব-

from django.db import models

# Create your models here.

class Link(models.Model):
    url = models.CharField(max_length=1000)
    code = models.CharField(max_length=200, null=True, blank=True, unique=True)

    def __str__(self):
        return self.url

➡️# ডাটাবেজ তৈরিঃ

python manage.py makemigrations 
python manage.py migrate

db.sqlite3 ফাইল ডাটাবেজ শো/দেখার জন্য vscode এডিটর এর মধ্যে SQLite Viewer extension থাকলে তা দেখতে পাবে। 

➡️# এডমিন প্যানেল তৈরিঃ

এখন, এডমিন লগইন প্যানেল তৈরি করার পালা। কমান্ড দেব- python manage.py createsuperuser যদি tty এরর টাইপের এরকম কিছু দেখায় সেক্ষেত্রে কমান্ড দেব- winpty python manage.py createsuperuser তখন এডমিন প্যানেল তৈরির নতুন username, email ও password বানাবে। এতে করে ১টা এডমিন প্যানেল তৈরি হয়ে গেল। এটা এক্সেস করবে যেভাবে- http://localhost:8000/admin বা http://127.0.0.1:8000/admin

Documents/Django/blogenv2/shortener/admin.py ফাইলটা নিম্নরূপ/এমন বানাব-

from django.contrib import admin
from .models import Link

# Register your models here.

admin.site.register(Link)

ধাপ 3.2 – 

➡️#  Documents/Django/blogenv2/shortener/models.py ফাইলটা (২য়)আপডেট করে নিম্নরূপ/এমন বানাব- 

from sqlite3 import IntegrityError
from django.db import models
import random
import string


def code_generator():
    letters = string.ascii_letters
    digits = string.digits
    character = letters + digits
    sample_char = ''.join(random.sample(character, 5))
    return sample_char


# Create your models here.
class LinkShortener(models.Model):
    long_url = models.CharField(max_length=250, unique=True)
    code = models.CharField(max_length=20, unique=True, blank=True, null=True)

    def __str__(self):
        return self.long_url

    def save(self, *arg, **kwarg):
        if not self.code:
            while True:
                try:
                    self.code = code_generator()
                except IntegrityError:
                    continue
                break
        return super().save(*arg, **kwarg)

args ও kwargs নিয়ে জানতে চাইলে এটা দেখুন- https://www.programiz.com/python-programming/args-and-kwargs

➡️# views.py ফাইলটা (২)আপডেট করে নিম্নরূপ/এমন বানিয়ে আরেকবার টেস্ট চালিয়ে দেখব কোডগুলো কাজ করতেছি কিনা –

এবং, এজন্য যেকোনো ব্রাউজারে  http://localhost:8000 বা  http://127.0.0.1:8000 এ ঢুকার মাধ্যমে সব ঠিকঠাক আছে কিনা চেক করব।

ধাপ 4 – ফাইনাল 

➡️#  Documents/Django/blogenv2/shortener/urls.py ফাইলটা (১)আপডেট করে নিম্নরূপ/এমন বানাব-

from django.urls import path, include
from . import views

urlpatterns = [
    path('', views.home_view, name= 'home'),
    path('<code>/', views.redirect_view, name= 'link_redirect')

➡️#  views.py ফাইলটা (৩)আপডেট করে নিম্নরূপ/এমন বানাব (Working with Redirect View)- 

from re import template
from django.shortcuts import render, get_object_or_404, redirect
from .models import LinkShortener


# Create your views here.

def home_view(request):
    if request.method == "POST" and 'long_url' in request.POST:
        url = request.POST.get('long_url')

        if LinkShortener.objects.filter(long_url=url).exists():
            link = LinkShortener.objects.get(long_url=url)
        else:
            link = LinkShortener(long_url=url)
            link.save()

        context = {'link': link}
        return render(request, 'index.html', context)

    template = 'index.html'
    context = {}
    return render(request, template, context)


def redirect_view(request, code):
    link = get_object_or_404(LinkShortener, code=code)
    return redirect(link.long_url)

 

✌️ব্যাস, প্রোজেক্ট কমপ্লিট হয়ে গেল। এখন যেকোনো ব্রাউজারে  http://localhost:8000 বা  http://127.0.0.1:8000 এ ঢুকলেই দেখবে যে django সাকসেসফুলি রান হয়ে প্রজেক্ট স্টার্ট হবে। এবং খালি বক্স এর মধ্যে যেকোনো লং ইউ আর এল paste করে এন্টার করলে তার রেজাল্ট শর্ট ইউ আর এল হবে।

Similar Posts

Leave a Reply

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