Tạo một Web App và xử lý khi người dùng yêu cầu truy cập trong Python Django

Nội dung

Bài này sẽ giới thiệu những nội dung sau:

  • Web App là gì? Cách tạo ra Web App
  • Cách thức hoạt động của web
  • Cách viết testcase đơn giản

Web App là gì? Cách tạo ra Web App

Web App là nơi để tạo ra những trang web nằm trong toàn bộ hệ thống website, trong 1 dự án thì ta cần chia ra nhiều web app nhằm dễ quản lý và phân chia công việc.

Ví dụ: Bạn sẽ tạo ra 1 app để quản lý những tác vụ đăng vụ đăng nhập, đăng xuất riêng; 1 app quản lý về trang chủ,… Và sau khi hoàn thành các app, chúng ta sẽ có một website hoàn chỉnh.

Để tạo 1 Web App. Hãy gõ lệnh này sau trong CMD:

python manage.py startapp <Tên APP>

Ta sẽ thấy sẽ xuất hiện folder trên màn hình

Bây giờ ta sẽ khai báo cho project biết ta vừa tạo 1 App mới (mục đích chính là nếu sau này App có liên quan trong việc thiết kế các bảng trong database).

Ta vào mục PythonWeb, mở file settings.py. Ở phần khai báo INSTALLED_APPS, tao ghi thêm tên App vào trong:

Để cập nhật cho phần settings. Ta sẽ chạy lệnh sau:

python manage.py migrate

Nếu ta chạy migrate project lần đầu. Thì project Django sẽ tạo một số bảng cho chức năng user, admin cho database hiện tại. Bản chất Django hỗ trợ cho chúng ta hệ thống user, admin để thuận tiện cho việc phát triển trang web nhanh hơn. Ở các bài sau thì Kteam sẽ giải thích chi tiết hơn.


Cách thức hoạt động của web

Bây giờ Kteam sẽ nói cho các bạn cách hoạt động của web như sau:

Phía Client chính là máy tính của người dùng, khi người dùng gửi 1 request bằng giao thức HTTP cho phía Server. Sau khi Server nhận được request, server sẽ phân tích xem người dùng yêu cầu thứ gì rồi sẽ response về cho máy người dùng.

Ví dụ: khi bạn đi vào địa chỉ www.google.com, là trình duyệt của bạn đang request đến server là ‘tôi muốn vào trang tìm kiếm google’, khi web server của google nhận được, google sẽ trả cho bạn response có html của trang tìm kiếm google, trình duyệt sẽ chuyển html sang giao diện cho bạn thấy (Nó giống như bạn tập design html và mở bằng trình duyệt vậy)

Ở Django, chúng ta sẽ viết ra các hàm để xử lý những request của client gửi đến cho web server của mình. Bây giờ ta sẽ viết 1 hàm xử lý ở file views.py trong app home.

from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
def index(request):
   response = HttpResponse()
   response.writelines('<h1>Xin chào</h1>')
   response.write('Đây là app home')
   return response

Đầu tiên mình sẽ import HttpResponse từ thư viện, sau đó sẽ viết 1 hàm index có tham số request (chính là request người dùng gửi về). Tại hàm này, mình tạo một instance HttpResponse, sử dụng method writelines hay write để viết nội dung html nằm trong response này. Cuối cùng sẽ return response để trả về cho máy người dùng.

Tiếp theo ta sẽ phải xây dựng bộ urls để ứng với mỗi url trên trang web thì sẽ gọi hàm gì xử lý request đó. Ở app home, ta tạo thêm 1 file urls.py có nội dung như sau:

from django.urls import path
from . import views

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

Mình sẽ import thêm class path để định nghĩa các urls , và views từ app home. biến urlpatterns là một list lưa các path tồn tại trong app home. ở đây mình tạo path có đường dẫn trắng và tương ứng gán hàm index từ module views.py (chính là file index mình viết ở trên). Các bạn tạm thời viết như vậy, phía dưới Kteam sẽ giải thích sau.

Bây giờ ta quay lại folder PythonWeb, có 1 file urls.py  thì như bài trước mình đã giải thích urls là file giúp chúng ta tạo các đường dẫn urls của trang web để liên kết các webpage lại với nhau. Kteam sẽ dùng file này để tổng hợp các urls con nằm ở mỗi web app. Ta vào file urls.py để chỉnh sửa như sau:

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
   path('admin/', admin.site.urls),
   path('home', include('home.urls')),
]

Đầu tiên ta sẽ thêm hàm include từ thư viện urls. Ở trong file urlpatterns, ta thêm một path có 2 tham số truyền vào: đầu tiên là tên của path là home, thứ hai là hàm include chưa tham số là ‘home.urls‘ có nghĩa là file urls trong app home. Khi ta chạy server vào localhost nó sẽ hiện như sau:

Có thể hiểu nôm na là hiện tại web server của chúng ta chỉ có 2 đường dẫn là admin và home. nếu ta vào localhost:8000 là path trắng thì trả về lỗi 404. Vậy bây giờ ta thử vào http://localhost:8000/home sẽ ra sao:

Nó trả về nội dung ở hàm index mà chúng ta đã viết. Vậy nguyên lý hoạt động như thế nào:

Khi người dùng vào đường dẫn /home, thì đầu tiên sẽ vào urls trong PythonWeb, tại đây ta đã khai báo rằng path home sẽ đưa cho urls ở app home quản lý, sau này các đường urls mở rộng như /home/123home/abc,… thì vào urls của home mà tìm. Rồi ở urls trong app home, ta chỉ có 1 path là  đường dẫn trắng chính là xử lý cho urls http://localhost:8000/home, ở path này sẽ gọi hàm index trong file views. Ở hàm index ta sẽ tạo 1 response có chưa vài nội dung giới thiệu và return nó về, response sẽ chạy về máy người dùng và hiển thị nội dung ra.

Bây giờ, ta muốn khi vào localhost:8000 thì mặc định chạy hàm index thì sao. Ta sẽ xóa định nghĩa path home bằng đường dẫn trắng là được

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
   path('admin/', admin.site.urls),
   path('', include('home.urls')),
]

Cách viết test case đơn giản

Trong việc lập trình, việc kiểm thử phần mềm là điều luôn luôn có. Có khi chúng ta cũng có thể tự viết 1 vài test case đơn giản để kiểm tra trước khi đưa cho đội ngũ tester kiểm thử. Bây giờ Kteam sẽ giúp các bạn viết 1 test case đơn giản như sau.

Bạn vào file tests.py trong app home để kiểm tra thử hàm index, bạn viết như sau:

from django.test import TestCase, SimpleTestCase

# Create your tests here.
class SimpleTest(SimpleTestCase):
   def test_home_page_status(self):
       response = self.client.get('/')
       self.assertEquals(response.status_code, 200)

Ta sẽ import thêm class SimpleTestCase là class con của TestCase, rồi khai báo 1 class SimpleTest kế thừa SimpleTetCase. Trong class TestCase thì các method test mặc định tên phải theo cú pháp ‘test_tên‘.

Ở method test_home_page_status, Kteam sẽ đặt vị trí của mình vào client thông qua self.client và gọi đến đường dẫn ‘/‘ tương ứng với http://localhost:8000 và nhận được response từ hàm index. Từ response ta thử kiểm tra xem status_code có bằng 200 không, vì theo quy tắc http khi response trả về thành công sẽ trả code là 200.

Bây giờ ta tắt server và gõ cú pháp sau để chạy test

python manage.py test  <Tên APP nếu ta muốn chạy riêng>

Ở đây ta chỉ cần chạy file test ở app home thì có kết quả như sau:

Ta thấy CMD hiển thị đã chạy 1 test trong 0.005s và OK (không có lỗi). Giờ ta thử đổi thay vì kiểm tra status code bằng 200 thì kiểm tra bằng 201 sẽ như thế nào:

Nó sẽ báo lỗi là kết quả status code không trả về giá trị mà ta mong muốn.

One thought on “Tạo một Web App và xử lý khi người dùng yêu cầu truy cập trong Python Django

  1. Pingback: Lập trình web với Python bằng Django - Arrow Trần

Leave a Reply