Giới thiệu Django

Django là 1 web framework khá nổi tiếng được viết hoàn toàn bằng ngôn ngữ Python. Nó là 1 framework với đầu đủ các thư viện, module hỗ trợ các web-developer. Django sử dụng mô hình MVC và được phát triển bởi Django Software Foundation (DSF một tổ chức phi lợi nhuận độc lập) Mục tiêu chính của Django là đơn giản hóa việc tạo các website phức tạp có sử dụng cơ sở dữ liệu. Django tập trung vào tính năng “có thể tái sử dụng” và “có thể tự chạy” của các component, tính năng phát triển nhanh, không làm lại những gì đã làm. Một số website phổ biến được xây dựng từ Django là Pinterest, Instagram, Mozilla, và Bitbucket.

Cài đặt Django

Bắt đầu với Django

Project

  1. Tạo Project Django cung cấp 1 câu lệnh để render ra 1 template với cấu trúc hoàn chỉnh django-admin startproject demo_django note: không đặt têt project là 'django' và 'test' và không đặt code trong /var/www Django sẽ trách đặt code ở các folder root.
  2. Dùng sublime để mở project đã tạo và cùng xem cấu trúc: Chúng ta thấy folder ngoài demo_django không liên quan gì tới code nên bạn có thể thay đổi tùy ý
    • demo_django/__init__.py là 1 file rỗng chỉ định việc cái đường dẫn folder này sẽ được xem như là 1 Python package.
    • demo_django/settings.py là file chứa các settings của project
      • DEBUG: DEBUG = True bật/tăt chế độ debug
      • ALLOWED_HOSTS:ALLOWED_HOSTS = [] nếu báo lỗi liên quan đến ALLOWED_HOSTS thì thêm địa chỉ vào list này.
      • INSTALLED_APPS: 1 project có thể có nhiều app, còn 1 app có thể thuộc nhiều project. Khi mình thêm 1 app mới thì cần cập nhật danh sách này. Đơn giản là nó chứa tất cả các app có thể dử dụng thanfhg instance của Django
        django.contrib.admin – Site admin
        django.contrib.auth – An authentication system. Hệ thống authentication
        django.contrib.contenttypes – Hệ thống content types
        django.contrib.sessions – Hệ thống session
        django.contrib.messages – Hệ thống message
        django.contrib.staticfiles – Hệ thống quản lý các file static
        
      • DATABASES: đặt tả Database muốn dùng : SQLite(default), Postgres, Mysql,...
    • demo_django/urls.py là file khai báo các URL của project (kiểu như routing, với địa chỉ nào thì sẽ thực thi hàm nào)
    • demo_django/wsgi.py là file dùng deploy project lên server
    • manage.py là file để tạo app, migrate,...
  3. chạy server trên local
    • python manage.py migrate
    • python manage.py runserver Note: Nếu gặp lỗi allowed hosts thì thêm ALLOWED_HOSTS = ['localhost', '127.0.0.1'] vào file settings.py

App

  1. Tạo App
    • python manage.py startapp book
    • cấu trúc của app
    • Thêm app vào trong demo_django/settings.py
      INSTALLED_APPS = [
       .....
       `book`,
       ]
      
  2. Tạo Model Django hỗ trợ ORM (object relational mapping) nói 1 cách dễ hiểu, là 1 class hướng đối tượng sẽ được map thành 1 bảng trong database, 1 object / instance (thực thể của 1 class) sẽ được map thành 1 record (1 dòng) của bảng trong database. Trong Book application ra thiết kế đơn giản :
    • Category model có field name,

    • Book model có field name, price, category, author_name

      from django.db import models
      
       # Create your models here.
      
      class Category(models.Model):
         name = models.CharField(max_length=200)
         def __str__(self):
           return self.name
      
      class Book(models.Model):
         name = models.CharField(max_length=200)
         price = models.IntegerField(default=0)
         category = models.ForeignKey(Category, on_delete=models.CASCADE)
         author_name = models.CharField(max_length=200)
         def __str__(self):
           return self.name
      
    Với việc khai báo như trên Django sẽ tạo 1 schema DB cho app và tạo API Python để truy cập Category và Book' Note: Bạn thấy hàm __str__() được khai báo trong class nó tương tự như method toString trong Java với object. Ở đây bạn có thể override nó trong class ở Python giúp bạn hiển thị friendly name trong object. Mình sẽ nói cụ thể ở phần Shell Python ở dưới Nếu không 3, Làm quen với migrate
    • Tạo migration với câu lệnh python manage.py makemigrations book
      Migrations for 'book':
      0001_initial.py:
       - Create model Category
       - Create model Book
       - Add field category to book
      
      Bằng việc chạy makemigrations, Django sẽ hiểu là bạn đang tạo 1 sự thay đổi đến Model (trong trường này bạn đang create new) và sự thay đổi này sẽ được lưu như 1 migration. sau khi chạy xong sẽ tạo ra file book/migrations/0001_initial.py Nếu ra chỉnh sửa cấu trức của database thì lần makemigrations sẽ tạo ra file dạng 0002_......py
    • Kiểm tra câu lệnh mysql, quản lý db schema hoặc dễ hiểu hơn là phần prefix của file: 0001_initial.py python manage.py sqlmigrate book 0001
      BEGIN;
      CREATE TABLE "book_book" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(200) NOT NULL, "price" integer NOT NULL, "author_name" varchar(200) NOT NULL);
      CREATE TABLE "book_category" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(200) NOT NULL);
      CREATE TABLE "book_book__new" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(200) NOT NULL, "price" integer NOT NULL, "author_name" varchar(200) NOT NULL, "category_id" integer NOT NULL REFERENCES "book_category" ("id"));
      INSERT INTO "book_book__new" ("category_id", "price", "id", "author_name", "name") SELECT NULL, "price", "id", "author_name", "name" FROM "book_book";
      DROP TABLE "book_book";
      ALTER TABLE "book_book__new" RENAME TO "book_book";
      CREATE INDEX "book_book_2d5f8f90" ON "book_book" ("category_id");
      
      COMMIT
      
      Ở đây có thể sẽ check format output , tên table, primary key,... xem đã chính xác chưa.
    • Nếu tất cả đã ok bạn có thể merge vào migrate để tạo table vào data base python manage.py migrate Cơ chế hoạt động của migrate là sẽ lấy tất cả những migration chưa đc apply và chạy lại trong db đảm bảo dữ liệu trong db không bị xóa.
    • Kết luận : makemigrations : tạo migrations cho những thay đổi sqlmigrate: check sql trước khi apply migrate: apply vào những thay đổi vào db Note: Bạn có thể sử dụng 1 câu lệnh duy nhất python manage.py makemigrations <app_name> && python manage.py migrate

Shell Python

Như rails có rails c thì để truy cập vào shell python chúng ta chạy lệnh command python manage.py shell

  1. Import những class mà mình mới khai báo from book.models import Book, Category
  2. Hiển thị tất cả số record trong table Category.objects.all()
  3. tạo record mới c= Category(name='Romatic') c.save() b = Book(category_id=1, name='ABC', price='123', author_name='Minh') b.save
  4. Như đã nói ở phần tạo model về hàm __str__() Category.objects.all() Khi sử dụng kết quả trả ra là : [<Category: Romatic>] Khi không sử dụng kết quả trả ra là: [<Category: Category object>]
  5. Filter Category.objects.filter(id=1) Category.objects.filter(name='Romatic') Book.objects.filter(category__name='Romatic')
  6. Thao tác với foreign key c = Category.objects.get(pk=1) Note: Các bạn có thể tạo Book theo cách t2: b = c.book_set.create(name='ABC', price='123', author_name='Minh')
    • từ Book truy cập tới Category b.category , b.category.name
    • từ Category truy cập tới Book c.book_set.all(), c.book_set.all()[0].name, c.book_set.all().count,....
  7. Xóa record b.delete()

Kết

Mới tìm hiểu về Python nên mình cũng chỉ đưa ra được những kiến thức cơ bản nhất có trong https://docs.djangoproject.com/en/1.7/intro/tutorial01/ https://www.djangoproject.com/start/ https://www.digitalocean.com/community/tutorials/how-to-install-the-django-web-framework-on-ubuntu-14-04