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ụ: Author
và Book
là các lớp model đại diện cho các bảng author
và book
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.
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.
# 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.
# 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()
# 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
.
# 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.
<!-- 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.
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.
<!-- 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>
# 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
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.
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.
# 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:
from rest_framework import serializers
from .models import Book
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = ['id', 'title', 'author', 'published_date']
{
"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.
# 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
Cách Discord Lưu Trữ Hàng Nghìn Tỷ Tin Nhắn Với ScyllaDB
Dec 06, 2024 • 9 min read
Idempotent Consumer: Xử lý thông điệp trùng lặp trong Microservices
Dec 04, 2024 • 7 min read
Hướng dẫn tích hợp Redux và React Query trong dự án React Vite
Nov 22, 2024 • 8 min read
Giới thiệu Kiến trúc Backend for Frontend (BFF)
Nov 16, 2024 • 10 min read
Flask là gì? Hướng dẫn tạo Ứng dụng Web với Flask
Nov 15, 2024 • 7 min read
Webhook là gì? So sánh Webhook và API
Nov 15, 2024 • 8 min read