Kiến trúc Django

Kiến trúc Django gồm ba phần chính:

  1. Tập hợp các công cụ giúp người lập trình thao tác với database dễ dàng hơn.
  2. Phần định nghĩa các mẫu văn bản (vd như nội dung mail, text thông báo nào đó, v.v…).
  3. Phần framework, xử lý luồng chạy giữa thao thác của user với database.

Dưới đây là sơ đồ mô tả phần 1 với 2
uc?id=19mjA2k48aFb_rvOjChRpnPEffkjsCJlU&export=download

  • Model là các tools làm việc với data và database.
  • Template là các văn bản giao diện mà bạn sẽ nhận từ các designers.
  • Còn View, nó có phải là một controller không.

Nhìn vào mô hình của Django, ta có thể thấy phần nào khá giống với những mô hình framework ngoài thị trường với cấu trúc MVC (Model - View - Controller). Nhưng với Django thì có tên khác là MTV (Model - Template - View). Lúc này View của Django sẽ đóng vai trò như controller của mô hình MVC, chỉ là cách gọi tên khác nhau thôi.

uc?id=1yH4Wg5Ox8PQ-sv8gQhrLTsAZ1evlVQbp&export=download

Cụ thể trong view sẽ là những gì.
uc?id=1ZPPgmaKHUI1gI36KJJVakH-rp91IQUvH&export=download

Cấu trúc của Django:
Đơn vị cơ bản của ứng dụng web Django là một project Django. Một project Django được tạo thành bởi một hoặc nhiều ứng dụng Django.
uc?id=1UdbCV7U-e8PydGExGzGPACHKAHQD3Y4P&export=download

App Django là một gói độc lập chỉ nên làm một việc. Nghĩa là trong 1 project có nhìu apps con, mỗi app con có công năng riêng, như app về blog, app quản lý users hoặc app quản lý lịch sự kiện. Bạn có thể xem trong file config settings.py, sẽ thấy tên các gói apps trong project, khi bạn có ứng dụng muốn thêm vào project, bạn sẽ khai báo ở đây.

# ...\myclub_project\myclub_site\myclub_site\settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'crypto',
]

Như trong file config trên, bạn có thể thấy Django đã thêm sẵn cho bạn một vài ứng dụng hữu ích cơ bản để viết một chương trình. Ngoài ra còn rất nhiều ứng dụng khác mà chưa được cài mặc định, bạn có thể thêm vào trong file INSTALLED_APPS.

Xem thử cấu trúc thư mục trong Django:

# ...\my_clubproject

\env_myclub
\myclub_site        <= This is your Django project
    \myclub_site    <= This is a Django app
    db.sqlite3      <= Your project database
    manage.py       <= Django project management utility
  • Thư mục env_myclub: là nơi chứa các định nghĩa về môi trường chạy. Bạn có thể định nghĩa nhưng môi trường thường có khi lập trình như local, dev, honban.
  • Thư mục myclub_site: là thư mục bao code dự án của bạn. Django không quan tâm đến tên thư mục, nên bạn có thể đổi tên tuỳ thích.
  • File db.sqlite3: file này sẽ được tạo khi bạn chạy lệnh migrate. Đó là cơ sở dữ liệu.
  • File manage.py: chỉ là một tiện ích giúp bạn run project của bạn.
  • Thư mục myclub_site mà nằm trong thư mục myclub_site: Đây là một ứng dụng web mà Django tạo sẵn cho bạn. Vì Django là framework cho web, nên nó mặc định bạn muốn tạo web, nên nó tạo sẵn một ứng dụng web đơn giản cho bạn.

Vì thư mục ngoài và thư mục con bên trong lại bị trùng tên, nên đôi khi gây ra nhầm lẫn cho nhiều người mới bắt đầu với Django. Như đã nói ở trên, Django không quan tâm đến tên thư mục lắm, nên thay vì với cấu trúc như sau:

\myclub_project
    \myclub_site
        \myclub_site
\myclub_project
    \myclub_root
        \myclub_site

Bây giờ nhìn sau hơn một chút trong thư mục myclub_site xem có gì.

# \myclub_project\myclub_root\

\myclub_site
    __init.py__
    settings.py
    urls.py
    wsgi.py
  • File init.py: Trước khi rờ tới Django, chắc hẳn bạn đã biết sơ qua python. File này chỉ cho python biết những file trong thư mục ấy là một gói.
  • File settings.py: chứa các cài đặt cho project. Mỗi project Django phải có một file như vậy.
  • File urls.py: như tên gọi của nó, chứa các config về đường dẫn.
  • File wsgi.py: cho phép máy server tương thích với WSGI.

Cấu trúc của Apps

Bây giờ chúng ta thử tạo một ứng dụng cơ bản, để xem trong ứng dụng của ta có gì khác với ứng dụng web mà Django đã tạo sẵn.

Di chuyển vào ứng dụng myclub_root, run lệnh:

python manage.py startapp events

Tạo ứng dụng mang tên events. Sau khi tạo xong, bạn mở file settings.py, và khai báo tên ứng dụng của bạn.

INSTALLED_APPS = [
    'events.apps.EventsConfig',
    'django.contrib.admin',
    # more apps
]

Bên trong thư mục events vừa tạo, sẽ thấy file apps.py. Tên class của file được đặt theo tên ứng dụng mà bạn vừa tạo. Trong trường hợp này là EventsConfig. Nên là để khai báo ứng dụng mới với Django, ta cần trỏ đến class trên. Tức thêm events.apps.EventsConfig vào file config.

Trong thư mục events vừa tạo cụ thể sẽ có những thành phần sau:

\events
    \migrations
    __init__.py
    admin.py
    apps.py
    models.py
    tests.py
    views.py
  • File __init__.py: như đã nói trên, để khai báo với python đây là một gói dữ liệu.
  • File admin.py: nơi quản lý các model trong ứng dụng.
  • File models.py: nơi định nghĩa các models trong ứng dụng.
  • File tests.py: viết mã test cho ứng dụng của bạn trước khi release sản phẩm.
  • File views.py: nơi cài đặt giao diện cho ứng dụng.

Đến đây chúng ta đã có được một bức tranh hoàn chỉnh một cách cơ bản khi làm việc với Django.

Khi bạn muốn định nghĩa code mới và của riêng bạn mà không phải view (không phải html), thì bạn chỉ cần tạo file python mới (*.py) trong ứng dụng của bạn, và khai báo tên class, function định nghĩa. Và bạn cũng nên phân các hàm liên quan đến database và các hàm không liên quan đến database riêng ra các file. Hạn chế không gộp lại tất cả trong một file.

Khi bạn thêm một module mới vào trong project, bạn cũng nên xem xét phạm vi sử dụng của module, tức nên đặt mở cấp global hay chỉ định nghĩa đặt biệt cho một ứng dụng nào đó thôi thì đặt riêng biệt trong ứng dụng.

Định nghĩa URLs

uc?id=1GTiErpb01zECvjVYwluJYlpbBXwDh4DR&export=download

Ví dụ bạn có một trang web là http://www.mycoolsite.com. Và bạn muốn xử lý gì đó khi truy cập và link http://www.mycoolsite.com/app1/. Lúc này, khi nhận được địa chỉ /app1 bạn muốn chạy vào function some_view() trong module views của ứng dụng app1, bạn sẽ khai báo với hàm path() như sau:

path(‘app1/’, app1.views.some_view()) 

Và tất nhiên bạn có thể trỏ đường dẫn đến bất cứ đâu mà bạn muốn xử lý.

Models

Như trong phần kiến trúc của Django đã viết trên, thì Models là phần sẽ giúp ứng dụng giao tiếp với database dễ dàng hơn.

Models của Django cũng gần như giống với những framework hiện đại đang có trên thị trường. Hầu như bạn không cần phải viết hay đụng đến câu lệnh SQL trừ khi bạn muốn viết, vì những models vi diệu này gần như được ánh xạ với database.

Database mà Django cung cấp hầu như là:

  • PostgreSQL
  • MySQL
  • SQLite
  • Oracle

Như mặc định ban đầu thì Django đã cài sẵn SQLite cho chúng ta. Bạn có thể sử dụng mà không cần bận tâm phải cài đặt như thế nào.

Ví dụ chúng ta muốn tạo một table trong database, thay vì viết SQL bằng tay, bạn có thể dùng models mà Django cung cấp để tạo table như sau:

# \myclub_root\events\models.py

from django.db import models
 
class Event(models.Model):
    name = models.CharField('Event Name', max_length=120)
    event_date = models.DateTimeField('Event Date')
    venue = models.CharField(max_length=120)
    manager = models.CharField(max_length = 60)
    description = models.TextField(blank=True)

Sau khi đã định nghĩa models, bạn chạy lệnh sau để tạo bảng:

python manage.py makemigrations events
python manage.py migrate events

Như vậy đã tạo xong table trong Database rồi đấy. Bạn có thể query vào db để xem table đã được thêm vào. Hoặc để thấy được câu lệnh SQL mà Django đã tạo giúp bạn để create table, bạn gõ:

python manage.py sqlmigrate events 0001_initial

Output sẽ như sau:

BEGIN;
--
-- Create model Event
--
CREATE TABLE "events_event" (
    "id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, 
    "name" varchar(120) NOT NULL,
    "event_date" datetime NOT NULL, 
    "venue" varchar(120) NOT NULL, 
    "manager" varchar(60) NOT NULL, 
    "description" text NOT NULL
);
COMMIT;

Cũng như những framework khác, Models của Django cũng cung cấp cho bạn đủ bốn chức năng cơ bản để thao tác với database, đó là insert, update, deleteselect.

Bây giờ chúng ta thử thao tác cơ bản với chức năng insert để xem chúng làm việc ra sao.

Thay vì viết thẳng vào code rồi run, thì mình viết trong môi trường run shell của python cho nhanh nhé. Đầu tiên vào truy cập vào môi trường python mà Django cũng đã cung cấp:

python manage.py shell

Lúc mới học python, muốn vào môi trường python bạn cũng phải gõ python rồi viết các hàm đơn giản. Thì đây cũng vậy nhưng mình chạy python theo cách mà Django cung cấp. Vừa rồi đã tạo models Event như trên. Để sử dụng models Event đã tạo, bạn cần import models đấy vào:

>>> from events.models import Event

Hiện tại table chỉ vừa được tạo và chưa có record nào cả. Bây giờ sẽ thêm một record vào table. Để thêm record mới, bạn cần tạo một object event và khai báo giá trị muốn lưu.

>>> from events.models import Event
>>> event1 = Event(name="Test Event1", event_date="2018-12-17",
...     venue="somewhere", manager="Bob")
>>>

Sau khi khai báo xong, bạn chỉ việc gọi hàm save() để insert object đã khai báo đó vào table.

event1.save()

Những chức năng khác cũng tương tự, bạn có thể tham khảo thêm trên document của Django.

Views

Nếu bạn đã làm quen với các framework với mô hình MVC, thì trong Django, Views đóng vai trò gần giống như controller. Views là nơi xử lý, điều hướng luồng đi. Nó sẽ quyết định dữ liệu nào sẽ gửi đến models để được xử lý, dữ liệu nào sẽ được trả về cho user. Để hiểu rõ hơn, hãy xem vài dòng code đơn giản trong views.py

# \myclub_root\events\views.py

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

def index(request):
    return HttpResponse("<h1>MyClub Event Calendar</h1>")
  • Đầu tiên là import hàm render(). Đây là sự import tự động trong Django. Hàm render sẽ giúp bạn chỉ định template nào sẽ được trả về và hiển thị cho user. Hàm cho phép bạn truyền dữ liệu động vào template để hiển thị.
  • Kế đến là import HttpResponse. Hàm giúp truyền và nhận dữ liệu đến user.
  • Cuối cùng là phần định nghĩa hàm index(). Đây là phần quan trọng trong views. Ở đây hàm index() chỉ là ví dụ đơn giản nhất. Hàm sẽ nhận dữ liệu từ phía user, dữ liệu đó được ném vào biến request. Bạn đọc biến request này và xử lý dữ liệu theo yêu cầu của user, sau đó dùng hàm HttpResponse() để trả dữ liệu đã xử lý về cho user.

Đến đây, câu hỏi đặt ra là nếu chúng ta có nhiều views, mỗi views xử lý nhiệm vụ khác nhau. Ví dụ với url http;//yourexample.com/ sẽ hiển thị “Welcome", với url http://yourexample.com/books sẽ hiển thị danh sách tên các cuốn sách. Làm sao Django nhận biết với url nào sẽ chạy vào views nào để xử lý dữ liệu. Như đã giới thiệu ở trên, bạn cần khai bao cho Django biết cụ thể url nào sẽ do view nào đảm nhiệm. Việc khai báo sẽ trong urls.py.

# \myclub_root\events\urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),
    path('books/', views.books, name='books'),
]

Templates

Cuối cùng là phần templates. Đây là phần hầu như sẽ chứa code HTML. Tức nội dung sẽ hiển thị về cho user. Views sẽ quyết định template nào sẽ được gọi hiển thị.

Trong templates, bạn có thể xử lý dữ liệu động từ views gửi tới. Việc xử lý biến trong template cũng khá đơn giản. Hầu như sẽ không một chút gì xa lạ nếu bạn là một nhà lập trình website.

Ý nghĩa Cú pháp
Cấu trúc logic {% if %}...{% endif %}
Cấu trúc vòng lặp {% for x in y %}...{% endfor %}
import file khác {% include "header.html" %}
Thể hiện giá trị của biến {{ title }}
More... v.v...

Tóm lại

Django là một framework viết bằng python và hầu như để lập trình website. Ngoài các framework thịnh hành trên thị trường hiện nay được viết bằng PHP thì Django cũng là một lựa chọn cho các fan python khi muốn tạo website mà mà không cần phải học thêm ngôn ngữ khác. Về phần template thì các cấu trúc, lệnh, hàm khác giống với các template hiện nay, nên việc tiếp cận cũng không mấy khó khăn. Trong phần hai, chúng ta sẽ demo cụ thể cách viết một website với Django.

Tham khảo

https://djangobook.com/