Trong phần một mình đã giới thiệu sơ qua về kiến trúc trong Django. Để hiểu rõ hơn, chúng ta thử làm một demo nhỏ hiển thị giá crypto bằng Django.

Demo với website hiển thị giá Crypto

1. Cài đặt môi trường

Cài đặt python

Bước đầu tiền luôn cần thiết khi phát triển một ứng dụng là cài đặt môi trường.

Đầu tiên bạn cần cài python. Truy cập vào https://www.python.org/, tải gói python phù hợp với OS của bạn và cài đặt.

Sau khi python xong, bạn mở terminal lên và check version:

$ python
Python 3.6.5 :: Anaconda, Inc.
$

Bạn có thể check những models đã được cài đặt bằng lệnh pip freeze trong python

$ pip freeze
certifi==2019.3.9
chardet==3.0.4
Django==2.0.6
idna==2.8
pytz==2019.1
requests==2.22.0
urllib3==1.25.3
$

Tiếp theo cài tool virtualenv với lệnh sau:

$ pip install virtualenv

virtualenv là tool giúp tạo các dự án python.

Tạo thư mục project

$ mkdir django-projects
$ cd django-projects/

Tạo thư mục dự án tên django-projects rồi di chuyển vào thư mục vừa tạo.

Cài đặt môi trường cho project của bạn với lệnh sau:

$ virtualenv .

Sau khi chạy lệnh trên xong, trong thư mục django-project sẽ có một vài thư mục môi trường như sau:

├── django-project
    ├── bin
    ├── include
    └── lib

Start môi trường với lệnh:

$ . bin/activate

Bên cạnh đó bạn có thể shutdown môi trường với lệnh:

$ deactivate

Cài đặt Django

Nếu bạn muốn cài Django với phiên bản mới nhất, bạn run lệnh sau:

$ pip install django

Nếu bạn muốn cài Django với phiên bản đặc định, bạn run lệnh sau kèm theo version muốn cài:

$ pip install django==2.0.6

Cài đặt project

Tiếp đến bạn tạo project trong Django với lệnh sau:

$ django-admin.py startproject mysite

Sau thi tạo xong, bạn sẽ có thư mục như sau:

├── django-project
    ├── bin
    ├── include
    ├── lib
    └── mysite                  ← thư mục project mysite
        ├── db.sqlite3
        ├── manage.py
        └── mysite              ← thư mục app mysite
            ├── __init__.py
            ├── __pycache__
            │   ├── __init__.cpython-36.pyc
            │   ├── settings.cpython-36.pyc
            │   ├── urls.cpython-36.pyc
            │   └── wsgi.cpython-36.pyc
            ├── settings.py
            ├── urls.py
            └── wsgi.py

Trong project mysite, Django tự động tạo giúp bạn một ứng dụng website cơ bản với tên app trùng với tên project mysite. Như đã nói ở trên, Django không quá quan tâm đến tên project, nên bạn có thể đổi tên khác đễ không bị nhầm lẫn với tên ứng dụng. Ở đây mình để nguyên tên không đổi.

Tiếp theo bạn thử run project xem nhé

# di chuyển vào project mysite
$ cd mysite
$ python manage.py runserver

Mở trình duyệt lên và gõ http://localhost:8000/. Lúc này bạn sẽ thấy webiste cơ bản như sau:
uc?id=1IqEXAImzwa4ldoBbNLoNht_qUuyXZC8a&export=download

Có vẻ mọi thứ đã chạy ổn. Nhưng bạn thử nhìn vào màn hình terminal, nếu bạn thấy warning You have 14 unapplied migration(s). , bạn cần cài thêm vài bước sau.
Warning báo như sau:
uc?id=1kaOCru5SDfOV_xN9fmyegcn6nEpo8dFg&export=download

Bạn nhấn Ctr+C để thoát, sau đó chạy những lệnh sau:

# di chuyển vào project mysite
$ cd mysite

# chạy lệnh migrate
$ python manage.py migrate

# start lại project
$ python manage.py runserver

Lúc này khi start lại project, bạn sẽ không còn thấy thông báo như trên nữa.

Tạo ứng dụng Crypto

Di chuyển vào project mysite, tạo ứng dụng crypto với lệnh như sau:

# di chuyển vào project mysite
$ cd mysite
$ python manage.py startapp crypto

Sau khi tạo xong bạn sẽ có cấu trúc thư mục như sau:

├── django-project
    ├── bin
    ├── include
    ├── lib
    ├── crypto   ← ứng dụng crypto đã được tạo
    └── mysite

Cụ thể trong ứng dụng crypto, bạn sẽ có những thứ như sau:

├── crypto
    ├── __init__.py
    ├── __pycache__
    ├── migrations
    ├── admin.py
    ├── apps.py
    ├── models.py
    ├── tests.py
    └── views.py

Khai báo ứng dựng crypto trong settings.py

Sau khi vừa tạo một ứng dụng mới, bạn vào settings.py để khai báo với Django tên ứng dụng của bạn.

# django-projects/mysite/mysite/settings.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'crypto',    # ← tên ứng dụng crypto được thêm vào
]

Khai báo đường dẫn urls

Hiện tại cứ gõ http://localhost:8000/ là Django đang đọc dữ liệu từ ứng dụng mysite để hiển thị lên. Làm sao để Django không chạy vào ứng dụng mysite nữa mà chạy vào ứng dụng crypto?

Trước tiên, bạn cận tạo file urls.py trong thư mục crypto như sau:

# django-projects/mysite/crypto/urls.py

from django.urls import path
from . import views

urlpatterns = [
    # Khi bạn khai báo đường dẫn với dấu nháy trống '',
    # nghĩa là sẽ nhận url root http://localhost:8000/
    path('', views.home, name='home'),
    
    # Nếu bạn có url http://localhost:8000/home
    # bạn sẽ khai báo như sau:
    # path('home', views.home, name='home'),
]

path('', views.home, name='home') cụ thể là như thế nào mình sẽ giải thích sau.

Tiếp đến bạn vào urls.py của ứng dụng mysite, khai báo thêm urls.py của crypto như sau:

# import thêm hàm include
from django.urls import include

urlpatterns = [
    ...
    # khai báo urls của crypto
    path('', include('crypto.urls'))
]

Trở lại với định nghĩa trong urls của crypto, path('', views.home, name='home') nghĩa là khi bạn gõ vào trình duyệt đường dẫn http://localhost:8000/, Django sẽ bắt đường dẫn này, dò tìm trong file urls rằng views nào sẽ nhận trách nhiệm xử lý tương ứng với request mà user đã yêu cầu. Trong trường hợp này, thì hàm home() trong views.py sẽ xử lý.

Định nghĩa views

Sau khi đã chỉ định hàm home() trong views.py sẽ xử lý nhiệm vụ hiển thị danh sách giá crypto, bạn mở file views.py và định nghĩa hàm home() như sau:

# django-projects/mysite/crypto/views.py

from django.shortcuts import render
import requests
import json

def home(request):

    # get crypto price Data
    price_request = requests.get("https://min-api.cryptocompare.com/data/pricemultifull?fsyms=BTC,XRP&tsyms=USD,EUR")
    price = json.loads(price_request.content)

    # truyền dữ liệu giá qua template để được hiển thị
    return render(request, 'home.html', {"price": price})

Ở phần lấy giá crypto, mình sử dụng dịch vụ https://min-api.cryptocompare.com để query. Trong bài viết này, mình sẽ không bàn về sử dụng APIs của dịch vụ trên. Nhìn chung thì cũng rất đơn giản, các bạn có thể tham khảo thêm trên website của họ.

Đầu tiên bạn cần import hai models là requestsjson để sử dụng trong việc gửi và nhận dữ liệu trả về. Import models render để sử dụng trong việc chỉ định template html sẽ hiển thị và truyền biến dữ liệu giá qua template.

requests.get() hàm này sẽ tạo ra một request đến địa chỉ mà bạn chỉ định. Ở đây mình truyền vào địa chỉ apis lấy giá của các đồng BTC, XRP.
json.loads() hàm sẽ nhận dữ liệu prices trả về dạng json
Ở phần render, mình sẽ chỉ định tên template sẽ hiển thị là home.html.

home.html sẽ là file nào và khai báo ở đâu?

Định nghĩa templates

Bạn cần tạo một thư mục với tên templates trong thư mục crypto để khai báo các file html. Sau khi tạo thư mục templates, như khai báo ở trên, bạn tạo thêm file home.html. Lúc này cấu trúc thư mục sẽ như sau:

crypto
    │   ├── __init__.py
    │   ├── __pycache__
    │   ├── admin.py
    │   ├── apps.py
    │   ├── migrations
    │   ├── models.py
    │   ├── templates          ← thư mục templates vừa tạo
    │   │   ├── home.html      ← file home.html vừa tạo
    │   ├── tests.py
    │   ├── urls.py
    │   └── views.py

Sau khi tạo xong, bạn định nghĩa file home.html như sau:

<table class="table table-striped">
  <thead>
    <tr>
      <th scope="col">Name</th>
      <th scope="col">Price</th>
      <th scope="col">24h High</th>
      <th scope="col">24h Low</th>
      <th scope="col">Market Cap</th>
    </tr>
  </thead>
  <tbody>
    {% for key, value in price.DISPLAY.items %}
    <tr>
      <td>{{ key }}</td>
      <td>{{ value.USD.PRICE }}</td>
      <td>{{ value.USD.HIGHDAY }}</td>
      <td>{{ value.USD.LOWDAY }}</td>
      <td>{{ value.USD.MKTCAP }}</td>
    </tr>
    {% endfor %}
  </tbody>
  </table>

Với cấu trúc json trong price mà Apis crypto trả về, ta sử dụng price.DISPLAY.items để truy vấn đến danh sách giá của crypto.

price.DISPLAY.items sẽ là một danh sách, nên ta sử dụng cấu trúc lặp for để hiển thị từng giá của cryto.

Bây giờ bạn thử refresh lại trình duyệt và sẽ hiển thị như sau:

uc?id=1HSsZC8NIwoRlvSf5zkxo92qF620oWr5_&export=download

Ở đây table mình hiển thị trong đẹp mắt là do mình có sử dụng Bootstrap. Nhưng về cơ bản là list price sẽ được loop và show ra như thế.

Dưới đây là website mình đã demo thử với Django. Các bạn có thể tham khảo thêm trong code của mình.

Github: https://github.com/lando110390/django_get_price_crypto

uc?id=1-JgPngIBAIHOwtDXUkNGw-vO7qawTEPD&export=download

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.

Tham khảo

https://djangobook.com/