Django

⌘K
  1. Home
  2. Django
  3. Django তে কিভাবে কাজ করতে...
  4. Logging and Monitoring Se...
  5. Error মনিটর করা Sentry দিয়ে

Error মনিটর করা Sentry দিয়ে


📌 Step 1: Project Setup

# Virtual environment তৈরি করো
python3 -m venv venv

# Activate করো linux
source venv/bin/activate

# Django install করো
pip install django

# Project তৈরি করো
django-admin startproject school_project
cd school_project

# App তৈরি করো
python manage.py startapp students

📌 Step 2: App Registration

school_project/settings.py খোলো এবং INSTALLED_APPS এ add করো:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'students',  # এটা add করো
]

📌 Step 3: Student Model তৈরি

students/models.py:

from django.db import models

class Student(models.Model):
    name = models.CharField(max_length=100)
    roll = models.IntegerField(unique=True)
    email = models.EmailField()
    phone = models.CharField(max_length=15)
    created_at = models.DateTimeField(auto_now_add=True)
    
    def __str__(self):
        return f"{self.name} - Roll: {self.roll}"
    
    class Meta:
        ordering = ['roll']

Migration করো:

python manage.py makemigrations
python manage.py migrate

📌 Step 4: Admin Panel Setup

students/admin.py:

from django.contrib import admin
from .models import Student

@admin.register(Student)
class StudentAdmin(admin.ModelAdmin):
    list_display = ['name', 'roll', 'email', 'phone', 'created_at']
    search_fields = ['name', 'roll', 'email']

Superuser তৈরি করো:

python manage.py createsuperuser
# Username, email, password দাও

📌 Step 5: Views তৈরি (CRUD Operations)

students/views.py:

from django.shortcuts import render, redirect, get_object_or_404
from django.contrib import messages
from .models import Student

# List all students
def student_list(request):
    students = Student.objects.all()
    return render(request, 'students/student_list.html', {'students': students})

# Create new student
def student_create(request):
    if request.method == 'POST':
        try:
            name = request.POST.get('name')
            roll = request.POST.get('roll')
            email = request.POST.get('email')
            phone = request.POST.get('phone')
            
            Student.objects.create(
                name=name,
                roll=roll,
                email=email,
                phone=phone
            )
            messages.success(request, 'Student added successfully!')
            return redirect('student_list')
        except Exception as e:
            messages.error(request, f'Error: {str(e)}')
    
    return render(request, 'students/student_form.html')

# Update student
def student_update(request, pk):
    student = get_object_or_404(Student, pk=pk)
    
    if request.method == 'POST':
        try:
            student.name = request.POST.get('name')
            student.roll = request.POST.get('roll')
            student.email = request.POST.get('email')
            student.phone = request.POST.get('phone')
            student.save()
            
            messages.success(request, 'Student updated successfully!')
            return redirect('student_list')
        except Exception as e:
            messages.error(request, f'Error: {str(e)}')
    
    return render(request, 'students/student_form.html', {'student': student})

# Delete student
def student_delete(request, pk):
    student = get_object_or_404(Student, pk=pk)
    
    if request.method == 'POST':
        try:
            student.delete()
            messages.success(request, 'Student deleted successfully!')
        except Exception as e:
            messages.error(request, f'Error: {str(e)}')
        
        return redirect('student_list')
    
    return render(request, 'students/student_confirm_delete.html', {'student': student})

# Error test করার জন্য
def test_error(request):
    # ইচ্ছা করে error তৈরি করছি
    result = 10 / 0  # ZeroDivisionError
    return render(request, 'students/test.html')

📌 Step 6: URLs Setup

students/urls.py (নতুন file তৈরি করো):

from django.urls import path
from . import views

urlpatterns = [
    path('', views.student_list, name='student_list'),
    path('create/', views.student_create, name='student_create'),
    path('update/<int:pk>/', views.student_update, name='student_update'),
    path('delete/<int:pk>/', views.student_delete, name='student_delete'),
    path('test-error/', views.test_error, name='test_error'),
]

school_project/urls.py update করো:

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

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

📌 Step 7: Templates তৈরি

Directory structure তৈরি করো:

students/
  templates/
    students/
      base.html
      student_list.html
      student_form.html
      student_confirm_delete.html

students/templates/students/base.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Student Management</title>
    <style>
        * { margin: 0; padding: 0; box-sizing: border-box; }
        body { font-family: Arial, sans-serif; background: #f5f5f5; padding: 20px; }
        .container { max-width: 1000px; margin: 0 auto; background: white; padding: 30px; border-radius: 10px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); }
        h1 { color: #333; margin-bottom: 20px; }
        .btn { padding: 10px 20px; background: #007bff; color: white; text-decoration: none; border-radius: 5px; display: inline-block; margin: 5px; border: none; cursor: pointer; }
        .btn:hover { background: #0056b3; }
        .btn-danger { background: #dc3545; }
        .btn-danger:hover { background: #c82333; }
        .btn-success { background: #28a745; }
        .btn-success:hover { background: #218838; }
        table { width: 100%; border-collapse: collapse; margin-top: 20px; }
        th, td { padding: 12px; text-align: left; border-bottom: 1px solid #ddd; }
        th { background: #007bff; color: white; }
        tr:hover { background: #f1f1f1; }
        .messages { margin: 20px 0; }
        .alert { padding: 15px; border-radius: 5px; margin-bottom: 10px; }
        .alert-success { background: #d4edda; color: #155724; }
        .alert-error { background: #f8d7da; color: #721c24; }
        form { margin-top: 20px; }
        .form-group { margin-bottom: 15px; }
        label { display: block; margin-bottom: 5px; font-weight: bold; }
        input { width: 100%; padding: 10px; border: 1px solid #ddd; border-radius: 5px; }
    </style>
</head>
<body>
    <div class="container">
        {% if messages %}
        <div class="messages">
            {% for message in messages %}
            <div class="alert alert-{{ message.tags }}">
                {{ message }}
            </div>
            {% endfor %}
        </div>
        {% endif %}
        
        {% block content %}
        {% endblock %}
    </div>
</body>
</html>

students/templates/students/student_list.html:

{% extends 'students/base.html' %}

{% block content %}
<h1>📚 Student List</h1>
<a href="{% url 'student_create' %}" class="btn btn-success">➕ Add New Student</a>
<a href="{% url 'test_error' %}" class="btn btn-danger">🔥 Test Error (Sentry)</a>

<table>
    <thead>
        <tr>
            <th>Roll</th>
            <th>Name</th>
            <th>Email</th>
            <th>Phone</th>
            <th>Actions</th>
        </tr>
    </thead>
    <tbody>
        {% for student in students %}
        <tr>
            <td>{{ student.roll }}</td>
            <td>{{ student.name }}</td>
            <td>{{ student.email }}</td>
            <td>{{ student.phone }}</td>
            <td>
                <a href="{% url 'student_update' student.pk %}" class="btn">✏️ Edit</a>
                <a href="{% url 'student_delete' student.pk %}" class="btn btn-danger">🗑️ Delete</a>
            </td>
        </tr>
        {% empty %}
        <tr>
            <td colspan="5" style="text-align: center;">No students found. Add one!</td>
        </tr>
        {% endfor %}
    </tbody>
</table>
{% endblock %}

students/templates/students/student_form.html:

{% extends 'students/base.html' %}

{% block content %}
<h1>{% if student %}✏️ Edit Student{% else %}➕ Add New Student{% endif %}</h1>

<form method="POST">
    {% csrf_token %}
    
    <div class="form-group">
        <label>Name:</label>
        <input type="text" name="name" value="{{ student.name }}" required>
    </div>
    
    <div class="form-group">
        <label>Roll Number:</label>
        <input type="number" name="roll" value="{{ student.roll }}" required>
    </div>
    
    <div class="form-group">
        <label>Email:</label>
        <input type="email" name="email" value="{{ student.email }}" required>
    </div>
    
    <div class="form-group">
        <label>Phone:</label>
        <input type="text" name="phone" value="{{ student.phone }}" required>
    </div>
    
    <button type="submit" class="btn btn-success">💾 Save</button>
    <a href="{% url 'student_list' %}" class="btn"> Cancel</a>
</form>
{% endblock %}

students/templates/students/student_confirm_delete.html:

{% extends 'students/base.html' %}

{% block content %}
<h1>🗑️ Delete Student</h1>

<p>Are you sure you want to delete <strong>{{ student.name }}</strong> (Roll: {{ student.roll }})?</p>

<form method="POST">
    {% csrf_token %}
    <button type="submit" class="btn btn-danger"> Yes, Delete</button>
    <a href="{% url 'student_list' %}" class="btn"> Cancel</a>
</form>
{% endblock %}

📌 Step 8: Server Run করো এবং Test করো

python manage.py runserver

এখন browser এ যাও: http://127.0.0.1:8000/students/

কিছু student add করো, edit করো, delete করো – সব test করো!


🎯 Step 9: Sentry Account খোলা এবং Setup

1️⃣ Sentry Account তৈরি

  1. যাও: https://sentry.io/signup/
  2. Sign up করো (GitHub/Google দিয়েও করতে পারবে)
  3. Free plan select করো

2️⃣ Project তৈরি

  1. Dashboard এ “Create Project” click করো
  2. Platform select করো: Django
  3. Project এর নাম দাও: school-project
  4. Click “Create Project”

3️⃣ DSN Copy করো

Setup page এ একটা DSN দেখবে যেটা এরকম দেখতে:

https://abc123xyz@o123456.ingest.sentry.io/7891011

এটা copy করে রাখো!


📌 Step 10: Sentry Setup in Django

# Sentry SDK install করো
pip install sentry-sdk

school_project/settings.py এর একদম শেষে add করো:

# Sentry Configuration
import sentry_sdk
from sentry_sdk.integrations.django import DjangoIntegration

sentry_sdk.init(
    dsn="YOUR_SENTRY_DSN_HERE",  # এখানে তোমার DSN paste করো
    integrations=[
        DjangoIntegration(),
    ],
    traces_sample_rate=1.0,  # 100% transactions track করবে
    send_default_pii=True,  # User info send করবে
    environment="development",  # Environment name
)

📌 Step 11: Error Test করো!

  1. Server run করো:
python manage.py runserver
  1. Browser এ যাও: http://127.0.0.1:8000/students/
  2. “Test Error” button এ click করো
  3. Sentry dashboard এ যাও: https://sentry.io/
  4. তোমার project এ click করো
  5. Issues tab এ error দেখতে পাবে! 🎉

🎁 Bonus: Different Types of Errors Test

students/views.py তে আরো error test functions add করো:

def test_division_error(request):
    # Division by zero
    result = 10 / 0
    return render(request, 'test.html')

def test_database_error(request):
    # Invalid database query
    Student.objects.get(roll=99999)  # Non-existent roll
    return render(request, 'test.html')

def test_custom_error(request):
    # Custom exception
    raise ValueError("This is a custom test error!")

URLs add করো:

path('test-division/', views.test_division_error, name='test_division'),
path('test-database/', views.test_database_error, name='test_database'),
path('test-custom/', views.test_custom_error, name='test_custom'),

📊 Sentry Dashboard এ কী কী দেখবে:

  1. Error Type: কোন ধরনের error (ZeroDivisionError, ValueError etc.)
  2. Stack Trace: কোন file এর কোন line এ error হয়েছে
  3. Request Info: URL, Method, Headers
  4. User Info: কোন user error করেছে
  5. Browser Info: Chrome, Firefox etc.
  6. Frequency: কতবার হয়েছে

✅ Final Checklist:

  • [ ] Project setup হয়েছে
  • [ ] Student CRUD কাজ করছে
  • [ ] Sentry account খোলা হয়েছে
  • [ ] Sentry DSN configure করা হয়েছে
  • [ ] Error test করা হয়েছে
  • [ ] Sentry dashboard এ error দেখা যাচ্ছে

How can we help?