Giới thiệu Django: Xây dựng ứng dụng Web với Python

HTTP và bản chất của các ứng dụng Web

Giao thức HTTP (HyperText Transfer Protocol) là nền tảng cho việc truyền tải dữ liệu giữa trình duyệt và máy chủ. Nó hoạt động trên lớp TCP, đảm bảo kết nối đáng tin cậy, đồng thời tuân theo nguyên tắc "kết nối ngắn" – mỗi yêu cầu từ client sẽ được xử lý xong rồi ngắt kết nối. Điều này có nghĩa rằng server không lưu trạng thái giữa các lần request, dẫn đến đặc tính "không trạng thái" (stateless) của HTTP.

Một phiên làm việc điển hình bao gồm:

  1. Client khởi tạo kết nối TCP đến server.
  2. Client gửi yêu cầu HTTP dưới dạng chuỗi văn bản, ví dụ: GET /home/ HTTP/1.1\r\nHost: example.com\r\n\r\n.
  3. Server phân tích yêu cầu, xử lý logic và trả về phản hồi gồm header và body.
  4. Client nhận dữ liệu, hiển thị nội dung lên giao diện, sau đó đóng kết nối.

Xây dựng máy chủ Web đơn giản bằng socket

Từ góc nhìn kỹ thuật, một máy chủ Web thực chất chỉ là một chương trình socket lắng nghe kết nối ở cổng nhất định. Dưới đây là ví dụ minh họa cách tạo máy chủ phục vụ nội dung tĩnh:

import socket

def start_server():
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    server.bind(('localhost', 8080))
    server.listen(5)

    while True:
        conn, addr = server.accept()
        request = conn.recv(1024).decode()
        print("Yêu cầu nhận được:", request)

        # Trả phản hồi cơ bản
        response_body = "<h1>Chào mừng bạn đến với máy chủ tự viết!</h1>"
        response = (
            "HTTP/1.1 200 OK\r\n"
            "Content-Type: text/html; charset=utf-8\r\n"
            f"Content-Length: {len(response_body)}\r\n"
            "\r\n"
            + response_body
        )
        conn.send(response.encode())
        conn.close()

if __name__ == "__main__":
    start_server()

Đoạn mã trên cho thấy cách thiết lập kết nối, đọc yêu cầu và trả về HTML. Tuy nhiên, việc xử lý file tĩnh, form, hoặc định tuyến URL sẽ nhanh chóng trở nên phức tạp nếu phải tự triển khai toàn bộ.

WSGI – Chuẩn hóa tương tác giữa ứng dụng và máy chủ

Để giảm thiểu sự trùng lặp và tăng khả năng tái sử dụng, Python đưa ra WSGI (Web Server Gateway Interface) như một chuẩn giao tiếp giữa máy chủ Web và ứng dụng. Theo đó, người phát triển tập trung vào phần logic nghiệp vụ, còn việc xử lý mạng được giao cho các công cụ hỗ trợ như wsgiref, uWSGI hay Gunicorn.

Dưới đây là ví dụ về ứng dụng WSGI đơn giản:

from wsgiref.simple_server import make_server

def application(environ, start_response):
    path = environ.get('PATH_INFO')

    if path == '/hello':
        content = '<h1>Xin chào!</h1>'
    elif path == '/about':
        content = '<h1>Thông tin</h1><p>Website học lập trình.</p>'
    else:
        content = '<h1>404 - Không tìm thấy</h1>'
        status = '404 Not Found'
    
    status = '200 OK'
    headers = [('Content-Type', 'text/html; charset=utf-8')]
    start_response(status, headers)
    return [content.encode('utf-8')]

if __name__ == '__main__':
    httpd = make_server('localhost', 8000, application)
    print("Chạy tại http://localhost:8000")
    httpd.serve_forever()

Với WSGI, việc định tuyến URL và xử lý phản hồi trở nên rõ ràng hơn. Tuy nhiên, khi cần thêm chức năng như template, quản lý session hay truy cập cơ sở dữ liệu, việc xây dựng từ đầu vẫn rất tốn kém.

Giải pháp: Sử dụng Django Framework

Django là framework Web toàn diện dành cho Python, nổi bật nhờ tốc độ phát triển nhanh, cấu trúc rõ ràng và hệ sinh thái phong phú. Với slogan "The web framework for perfectionists with deadlines", Django phù hợp để xây dựng các ứng dụng sản xuất như Instagram, Pinterest hay Disqus.

Cài đặt và khởi tạo dự án

Cài đặt qua pip:

pip install django

Tạo dự án mới:

django-admin startproject myproject

Cấu trúc thư mục chính:

  • manage.py: Công cụ dòng lệnh để quản lý ứng dụng.
  • myproject/settings.py: Cấu hình toàn cục (database, middleware, cài đặt bảo mật...).
  • myproject/urls.py: Định tuyến URL cấp cao.
  • myproject/wsgi.py: Điểm vào cho máy chủ WSGI.

Tạo ứng dụng con (app)

Django khuyến khích chia nhỏ chức năng thành các app riêng biệt. Ví dụ:

python manage.py startapp users

Mỗi app thường chứa:

  • views.py: Xử lý logic yêu cầu.
  • models.py: Định nghĩa cấu trúc cơ sở dữ liệu.
  • templates/: Lưu file HTML.
  • urls.py: Định tuyến riêng cho app.

Mô hình MTV trong Django

Django áp dụng mô hình MTV (Model-Template-View), biến thể từ MVC:

  • Model: Quản lý dữ liệu, tương tác với database.
  • Template: Xác định cách hiển thị (giao diện người dùng).
  • View: Nhận yêu cầu, gọi model lấy dữ liệu, truyền vào template và trả kết quả.

Luồng xử lý tiêu biểu:

Request → urls.py → view → model/template → Response

Phục vụ nội dung động đầu tiên

Tạo file views.py trong app:

from django.http import HttpResponse
from django.shortcuts import render

def home(request):
    context = {'message': 'Chúc mừng bạn đã chạy được trang đầu tiên!'}
    return render(request, 'home.html', context)

Thêm định tuyến trong urls.py:

from django.urls import path
from . import views

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

Tạo template templates/home.html:

<!DOCTYPE html>
<html>
<head><title>Trang chủ</title></head>
<body>
  <h1>{{ message }}</h1>
</body>
</html>

Kích hoạt template trong settings.py bằng cách khai báo đúng đường dẫn thư mục TEMPLATES. Sau đó khởi động server:

python manage.py runserver

Ứng dụng sẽ chạy tại http://localhost:8000, hiển thị nội dung động từ view thông qua template engine của Django.

Thẻ: Django python Web Development wsgi MTV

Đăng vào ngày 5 tháng 6 lúc 22:30