Facebook Pixel

Django là gì? Khám phá Framework phát triển Web bằng Python

26 Aug, 2024

Django là một Framework phát triển Web bằng Python, được thiết kế để giúp lập trình viên xây dựng các ứng dụng web phức tạp một cách nhanh chóng

Django là gì? Khám phá Framework phát triển Web bằng Python

Mục Lục

Django là một trong những framework phát triển web bằng Python phổ biến nhất hiện nay. Được phát hành lần đầu vào năm 2005, Django đã nhanh chóng trở thành lựa chọn ưa thích của nhiều lập trình viên và các công ty công nghệ.

1. Django là gì?

Django là một framework phát triển web mã nguồn mở dựa trên ngôn ngữ lập trình Python. Django ra đời nhằm mục đích đơn giản hóa và tăng tốc quá trình phát triển ứng dụng web bằng cách cung cấp sẵn các công cụ và quy tắc chung để thực hiện những tác vụ phổ biến trong phát triển web. Nhờ đó, bạn có thể tập trung vào việc xây dựng các tính năng của ứng dụng mà không cần phải lo lắng quá nhiều về các chi tiết kỹ thuật phức tạp.

Ví dụ: Khi bạn đã định nghĩa các mô hình dữ liệu (Model) như Product hay Order, Django tự động tạo ra một giao diện quản trị để bạn thêm, sửa, xóa các mục này thông qua một trang web quản trị mà không cần phải tự xây dựng giao diện quản trị từ đầu.

2. Các tính năng mà Django cung cấp

2.1 ORM (Object-Relational Mapping)

ORM (Object-Relational Mapping) trong Django cho phép bạn làm việc với cơ sở dữ liệu bằng cách sử dụng các lớp và đối tượng Python thay vì phải viết các câu lệnh SQL trực tiếp.

Ví dụ: AuthorBook là các lớp model đại diện cho các bảng authorbook trong cơ sở dữ liệu, name, birth_date, title, author, và published_date là các cột trong các bảng này.

Python
from django.db import models

class Author(models.Model):
    name = models.CharField(max_length=100)
    birth_date = models.DateField()

class Book(models.Model):
    title = models.CharField(max_length=200)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)
    published_date = models.DateField()

Django ORM giúp bạn truy vấn dữ liệu trong cơ sở dữ liệu bằng cách sử dụng các phương thức Python, giúp việc truy vấn trở nên trực quan hơn so với SQL.

Python
# Lấy tất cả các sách trong cơ sở dữ liệu
books = Book.objects.all()

# Tìm sách theo tiêu đề
book = Book.objects.get(title="1984")

# Lọc sách theo tác giả
books_by_orwell = Book.objects.filter(author__name="George Orwell")

# Sắp xếp sách theo ngày xuất bản
sorted_books = Book.objects.order_by('published_date')

2.2 Admin Interface

Admin Interface trong Django là một công cụ giúp bạn quản lý và thao tác với dữ liệu của ứng dụng web một cách dễ dàng và trực quan thông qua một giao diện quản trị tự động được tạo ra.

Khi bạn định nghĩa các mô hình (models) trong ứng dụng Django, bạn có thể dễ dàng đăng ký chúng với Django admin để tự động tạo ra giao diện quản trị cho các mô hình đó. Giao diện quản trị này giúp bạn thao tác với dữ liệu một cách trực quan mà không cần viết thêm code HTML.

Python
# models.py
from django.db import models

class Author(models.Model):
    name = models.CharField(max_length=100)
    email = models.EmailField()

class Book(models.Model):
    title = models.CharField(max_length=200)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)
    published_date = models.DateField()
Python
# admin.py
from django.contrib import admin
from .models import Author, Book

admin.site.register(Author)
admin.site.register(Book)

2.3 URL Routing

URL Routing trong Django là một cơ chế cho phép bạn định tuyến các yêu cầu HTTP đến các view cụ thể dựa trên URL mà người dùng truy cập. Khi người dùng truy cập một URL trên trang web của bạn, Django sẽ tìm kiếm các mẫu URL (URL patterns) được định nghĩa trong các tệp urls.py để tìm ra view phù hợp để xử lý yêu cầu. Mỗi mẫu URL thường được liên kết với một hàm view hoặc một class view trong Django.

Ví dụ: Mọi URL bắt đầu bằng /admin/ sẽ được chuyển đến trang quản trị của Django.  Mọi URL bắt đầu với /blog/ sẽ được chuyển đến các pattern URL được định nghĩa trong file blog/urls.py.

Python
# mysite/urls.py (urls.py của dự án chính)
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),  # Đường dẫn đến trang admin của Django
    path('blog/', include('blog.urls')),  # Kết hợp các URL của ứng dụng 'blog'
]

# blog/urls.py (urls.py của ứng dụng 'blog')
from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),  # Trang chủ của ứng dụng blog
    path('<int:post_id>/', views.post_detail, name='post_detail'),  # Chi tiết bài viết
]

2.4 Template Engine

Template Engine trong Django là một hệ thống giúp bạn xây dựng giao diện người dùng (UI) cho ứng dụng web của mình. Nó giúp bạn tách biệt rõ ràng giữa phần logic xử lý dữ liệu (backend) và phần hiển thị giao diện (frontend). Template Engine của Django giúp bạn tạo các trang HTML động bằng cách sử dụng các biến, logic điều khiển (như vòng lặp và điều kiện), và các template inheritance.

HTML
<!-- Ví dụ về template đơn giản -->
<h1>Welcome, {{ user.username }}!</h1>
<p>Today is {{ current_date }}.</p>

<!-- Ví dụ về template tag -->
{% if user.is_authenticated %}
    <p>Welcome back, {{ user.username }}!</p>
{% else %}
    <p>Please log in.</p>
{% endif %}

2.5 Authentication and Authorization

Django cung cấp hệ thống xác thực (authentication) để quản lý người dùng và hệ thống phân quyền (authorization) nhằm kiểm soát quyền truy cập đến các phần khác nhau của ứng dụng.

Giả sử bạn có một ứng dụng blog với các bài viết (posts), chỉ người dùng đã đăng nhập mới có thể tạo hoặc chỉnh sửa. Bạn cũng muốn chỉ những người dùng thuộc nhóm "Editors" mới có quyền chỉnh sửa bất kỳ bài viết nào.

Python
from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required, permission_required
from .models import Post

@login_required
def create_post(request):
    if request.method == 'POST':
        # Xử lý việc tạo bài viết
        pass
    return render(request, 'create_post.html')

@permission_required('app.change_post', raise_exception=True)
def edit_post(request, post_id):
    post = Post.objects.get(id=post_id)
    if request.method == 'POST':
        # Xử lý việc chỉnh sửa bài viết
        pass
    return render(request, 'edit_post.html', {'post': post})

2.6 Security

Security trong Django là một tập hợp các tính năng và cơ chế được tích hợp sẵn nhằm bảo vệ ứng dụng web khỏi các mối đe dọa và lỗ hổng bảo mật phổ biến như Cross-Site Scripting (XSS) Cross-Site Request Forgery (CSRF), SQL Injection.

HTML
<!-- Ví dụ về XSS Protection -->
<p>{{ user_input }}</p>

<!-- Ví dụ về CSRF Protection -->
<form method="post">
    {% csrf_token %}
    <!-- Các trường form khác -->
    <button type="submit">Submit</button>
</form>
Python
# Ví dụ về SQL Injection Protection
from django.shortcuts import render
from .models import User

def search_user(request):
    query = request.GET.get('q')
    users = User.objects.filter(username__icontains=query)
    return render(request, 'users.html', {'users': users})

2.7 Middleware

Middleware trong Django là các thành phần trung gian có nhiệm vụ xử lý các yêu cầu (requests) và phản hồi (responses) trong suốt vòng đời của một yêu cầu HTTP, hoạt động như một lớp trung gian giữa các yêu cầu từ người dùng và các view trong ứng dụng. Nó có thể được sử dụng để thực hiện các tác vụ như xác thực, ghi log, xử lý session, bảo mật.

Khi một yêu cầu HTTP được gửi đến một ứng dụng Django, yêu cầu này sẽ đi qua một chuỗi các middleware trước khi đến view tương ứng. Sau khi view xử lý xong và trả về một phản hồi, phản hồi này cũng sẽ đi qua chuỗi middleware trước khi được gửi lại cho người dùng. Giả sử bạn muốn tạo một middleware để ghi log các thông tin về mỗi yêu cầu

Python
import time

class SimpleLoggingMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        # Trước khi view được gọi
        start_time = time.time()

        # Gọi view và nhận phản hồi
        response = self.get_response(request)

        # Sau khi view đã được gọi
        duration = time.time() - start_time
        print(f"Request to {request.path} took {duration:.2f} seconds")

        return response

2.8 Forms and Validation

Django cung cấp framework giúp lập trình viên tạo và quản lý các form HTML, xử lý dữ liệu đầu vào của người dùng, và thực hiện việc xác thực (validation) dữ liệu một cách dễ dàng và an toàn, giúp bảo vệ ứng dụng khỏi các lỗi và tấn công phổ biến như SQL injection.

Python
from django import forms

class BookForm(forms.Form):
    title = forms.CharField(max_length=200)
    author = forms.CharField(max_length=100)
    published_date = forms.DateField()

    def clean_title(self):
        title = self.cleaned_data.get('title')
        if "badword" in title:
            raise forms.ValidationError("Title contains inappropriate content")
        return title

2.9 Database Support

Django hỗ trợ nhiều loại cơ sở dữ liệu như: PostgreSQL, MySQL, SQLite, Oracle, ... cho phép bạn lựa chọn loại database phù hợp nhất. Bạn cũng có thể chuyển đổi giữa các hệ quản trị cơ sở dữ liệu khác nhau mà không cần phải thay đổi mã nguồn nhiều.

Python
# settings.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'mydatabase',
        'USER': 'mydatabaseuser',
        'PASSWORD': 'mypassword',
        'HOST': 'localhost',
        'PORT': '5432',
    }
}

2.10 REST Framework

Django REST framework giúp bạn xây dựng các API RESTful dễ dàng. Nếu bạn có một model Book trong Django, bạn cần tạo một BookSerializer để chuyển đổi đối tượng Book thành JSON và ngược lại. BookSerializer sẽ biến một đối tượng Book thành một đối tượng JSON như sau:

Python
from rest_framework import serializers
from .models import Book

class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book
        fields = ['id', 'title', 'author', 'published_date']
JSON
{
    "id": 1,
    "title": "1984",
    "author": "George Orwell",
    "published_date": "1949-06-08"
}

Ngược lại, nó có thể nhận dữ liệu JSON từ client và chuyển đổi thành một đối tượng Book để lưu trữ trong cơ sở dữ liệu.

2.11 Community and Ecosystem

Django có một cộng đồng người dùng lớn, cung cấp nhiều gói mở rộng (app). Ví dụ, django-allauth được sử dụng để thêm các phương thức xác thực qua mạng xã hội.

Python
# settings.py
INSTALLED_APPS = [
    'django.contrib.sites',
    'allauth',
    'allauth.account',
    'allauth.socialaccount',
    'allauth.socialaccount.providers.google',
    # other installed apps...
]

AUTHENTICATION_BACKENDS = (
    'django.contrib.auth.backends.ModelBackend',
    'allauth.account.auth_backends.AuthenticationBackend',
)

SITE_ID = 1

3. Kết luận

Django là một framework phát triển web mạnh mẽ và phổ biến bằng Python, được thiết kế để giúp lập trình viên xây dựng các ứng dụng web phức tạp một cách nhanh chóng và dễ dàng. Với triết lý "batteries included," Django cung cấp một bộ công cụ đầy đủ từ ORM, hệ thống xác thực, bảo mật cao đến giao diện quản trị tự động, tất cả đều được tích hợp sẵn để bạn không phải phụ thuộc quá nhiều vào các thư viện bên ngoài.

Các bài viết liên quan tại Blog 200Lab:

Bài viết liên quan

Lập trình backend expressjs

xây dựng hệ thống microservices
  • Kiến trúc Hexagonal và ứng dụngal font-
  • TypeScript: OOP và nguyên lý SOLIDal font-
  • Event-Driven Architecture, Queue & PubSubal font-
  • Basic scalable System Designal font-

Đăng ký nhận thông báo

Đừng bỏ lỡ những bài viết thú vị từ 200Lab