#Django คืออะไร

Django เป็น Web Framework สำหรับ Python ที่รองรับการพัฒนาเว็บแบบครบวงจร โดยมีระบบ URL routing, ORM, template, form, authentication, admin และ migration ในตัว เหมาะกับเว็บแอปพลิเคชัน ระบบจัดการข้อมูล และ Backend API

#สถาปัตยกรรม MVT

  • Model กำหนดโครงสร้างข้อมูลและติดต่อฐานข้อมูลผ่าน ORM
  • View ประมวลผลคำขอและส่งผลลัพธ์
  • Template แสดง HTML ให้ผู้ใช้

ลำดับการทำงาน: Browser → URLconf → View → Model/Database → Template หรือ JSON Response

#Workshop: สร้างระบบจัดการหนังสือ

#1. เตรียมสภาพแวดล้อม

ต้องมี Python 3 และ pip ติดตั้งอยู่แล้ว

mkdir django-books && cd django-books
python -m venv .venv
# macOS/Linux
source .venv/bin/activate
# Windows PowerShell: .venv\Scripts\Activate.ps1
python -m pip install django
python -m django --version

#2. สร้างโครงการและแอป

django-admin startproject config .
python manage.py startapp books

เพิ่ม "books" ใน INSTALLED_APPS ภายใน config/settings.py

#3. สร้าง Model

ไฟล์ books/models.py

from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=200)
    author = models.CharField(max_length=120)
    published_year = models.PositiveIntegerField()
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title
python manage.py makemigrations
python manage.py migrate

#4. เพิ่ม Django Admin

ไฟล์ books/admin.py

from django.contrib import admin
from .models import Book

@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
    list_display = ("id", "title", "author", "published_year")
    search_fields = ("title", "author")
python manage.py createsuperuser

#5. สร้าง API แบบ JSON โดยใช้ Django ล้วน

ไฟล์ books/views.py

import json
from django.http import JsonResponse
from django.views.decorators.http import require_http_methods
from .models import Book

@require_http_methods(["GET", "POST"])
def book_list(request):
    if request.method == "GET":
        data = list(Book.objects.values("id", "title", "author", "published_year"))
        return JsonResponse(data, safe=False)

    try:
        payload = json.loads(request.body)
        title = str(payload["title"]).strip()
        author = str(payload["author"]).strip()
        year = int(payload["published_year"])
        if not title or not author or not 1 <= year <= 9999:
            raise ValueError("Invalid field values")
        book = Book.objects.create(title=title, author=author, published_year=year)
    except (ValueError, KeyError, TypeError, json.JSONDecodeError) as exc:
        return JsonResponse({"error": str(exc)}, status=400)
    return JsonResponse({"id": book.id, "title": book.title}, status=201)

ไฟล์ books/urls.py

from django.urls import path
from .views import book_list

urlpatterns = [
    path("books/", book_list, name="book-list"),
]

ไฟล์ config/urls.py

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

urlpatterns = [
    path("admin/", admin.site.urls),
    path("api/", include("books.urls")),
]

#6. ทดสอบ

python manage.py runserver
# GET
curl http://127.0.0.1:8000/api/books/
# POST: ใช้ curl พร้อม cookie/session และ CSRF token เมื่อเปิด CSRF middleware

ข้อควรระวัง: Django เปิด CSRF protection โดยค่าเริ่มต้นสำหรับ POST ผ่าน middleware การส่ง POST ด้วย curl แบบไม่มี CSRF token จะได้รับ 403 ไม่ควรปิด CSRF เพื่อแก้ปัญหาในระบบจริง หากพัฒนา API สำหรับ client ภายนอก ควรใช้ Django REST Framework พร้อม authentication และ permission ที่เหมาะสม

#Django REST Framework (DRF)

เมื่อระบบต้องการ CRUD API, serializer, validation, authentication, permission และ pagination ควรพิจารณา DRF

python -m pip install djangorestframework

เพิ่ม rest_framework ใน INSTALLED_APPS แล้วสร้าง serializer, viewset และ router สำหรับ API ที่ขยายได้ง่าย

#แนวทางนำขึ้น Production

  • ตั้ง DEBUG=False และกำหนด ALLOWED_HOSTS
  • จัดการ SECRET_KEY ผ่าน environment variables
  • ใช้ PostgreSQL สำหรับระบบที่ต้องการรองรับงานจริง
  • ใช้ Gunicorn/Uvicorn ร่วมกับ reverse proxy ตามรูปแบบ deployment
  • จัดการ static files, HTTPS, logging, backups และ migration
  • เขียน automated tests ด้วย Django TestCase หรือ pytest-django

#สรุป

Django เหมาะกับการพัฒนา Web Application ที่ต้องการโครงสร้างชัดเจนและความสามารถพร้อมใช้ ส่วน Django REST Framework ช่วยต่อยอดเป็น REST API ที่ดูแลและขยายระบบได้สะดวก

#แหล่งเรียนรู้