Django - Demo với website hiển thị giá Crypto - Phần 1
Kiến trúc Django
Kiến trúc Django gồm ba phần chính:
- 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.
- 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…).
- 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
- 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.
Cụ thể trong view sẽ là những gì.
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.
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ệnhmigrate
. Đó 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ụcmyclub_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
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
, delete
và select
.
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àmrender
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 trongviews
. Ở đây hàmindex()
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àmHttpResponse()
để 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.