Python cơ bản với Django Framework
Bài đăng này đã không được cập nhật trong 3 năm
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
- Các bạn có thể tham khảo ở https://www.digitalocean.com/community/tutorials/how-to-install-the-django-web-framework-on-ubuntu-14-04 Các bạn nên dùng virtualenv và pip để cài Django
Bắt đầu với Django
Project
- 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. - 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,...
- DEBUG:
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 servermanage.py
là file để tạo app, migrate,...
- 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
- 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`, ]
- 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ó fieldname
, -
Book model
có fieldname
,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
__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
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_......pyMigrations for 'book': 0001_initial.py: - Create model Category - Create model Book - Add field category to book
- 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
Ở đây có thể sẽ check format output , tên table, primary key,... xem đã chính xác chưa.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
- 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 đổisqlmigrate
: check sql trước khi applymigrate
: 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ấtpython 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
- Import những class mà mình mới khai báo
from book.models import Book, Category
- Hiển thị tất cả số record trong table
Category.objects.all()
- 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
- 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>]
- Filter
Category.objects.filter(id=1)
Category.objects.filter(name='Romatic')
Book.objects.filter(category__name='Romatic')
- 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
,....
- từ Book truy cập tới Category
- 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
All rights reserved