BẮT ĐẦU LẬP TRÌNH APP VỚI PYTHON DJANGO (Phần 1)

BẮT ĐẦU LẬP TRÌNH APP VỚI PYTHON DJANGO (Phần 1)

Trong chuỗi bài viết này, chúng ta sẽ cùng nhau tạo ra một app poll cơ bản (app thăm dò ý kiến).
App này gồm 2 phần:

  • Một public site để mọi người xem polls và vote
  • Một admin site để bạn thêm, thay đổi và xóa polls

Ở phần 1 của series, mục tiêu của chúng ta là tạo ra 1 server localhost để khi truy cập vào sẽ ra một trang web với dòng chữ “Hello, world. You’re at the polls index.
Giả định rằng bạn đã cài đặt Django. Bạn có thể kiểm tra xem máy tính bạn đã cài đặt Django chưa và version nào bằng cách chạy lệnh dưới đây trên terminal (Mac/Linus) hoặc trên command prompt (Windows):

$ python -m django --version

Nếu Django đã được cài đặt, bạn sẽ nhìn thấy version mà bạn đã cài đặt. Nếu không bạn sẽ thấy lỗi “No module named django”.
Chuỗi bài này được viết cho Django 3.0, hỗ trợ Python 3.6 trở lên.

Tạo project

Nếu đây là lần đầu bạn sử dụng Django, bạn cần quan tâm đến những bước setup đầu tiên. Bạn có thể dùng lệnh có sẵn của Django để tự động tạo khung sườn code có sẵn cho dự án của mình.

Từ giao diện nhập dòng lệnh (command line interface – CLI), cd (di chuyển vào thư mục chỉ định) đến thư mục mà bạn muốn lưu trữ code, sau đó chạy lệnh dưới đây:

$ django-admin startproject mysite

Thư mục mysite sẽ được tạo trong thư mục hiện tại.

Lưu ý: Bạn cần tránh đặt tên project trùng với các components (thành phần) được thiết lập trong Python hay Django. Cụ thể, bạn nên tránh sử dụng tên django vì nó sẽ mâu thuẫn với chính Django, hay dùng tên test vì nó sẽ mâu thuẫn với package thiết lập trong Python.
Đây là những gì mà lệnh startproject đã tạo ra:

mysite/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        asgi.py
        wsgi.py

  • Thư mục gốc mysite/ ngoài cùng là container của project. Tên của thư mục gốc này không ảnh hưởng đến Django; bạn có thể đổi tên của nó thành bất cứ gì.
  • Thư mục mysite/ bên trong là package Python thực tế cho project của bạn. Tên của thư mục này là tên của package Python bạn cần dùng để import bất cứ thứ gì trong nó
  • mysite/__init__.py: là một file rỗng để đánh dấu đây là package của Python.
  • mysite/settings.py: Cài đặt/ cấu hình cho project này.
  • mysite/urls.py: Các khai báo URL cho project này, đóng vai trò làm router để hướng dẫn các request đến file xử lý phù hợp.
  • mysite/asgi.py và mysite/wsgi.py: file cấu hình cho server

Development server (localhost)

Cùng kiểm tra xem project Django của bạn có hoạt động không. Vào thư mục mysite bên ngoài và chạy lệnh sau:

$ python manage.py runserver

Bạn sẽ thấy kết quả như sau trên command line:

Performing system checks...

System check identified no issues (0 silenced).

You have unapplied migrations; your app may not work properly until they are applied.
Run 'python manage.py migrate' to apply them.

April 01, 2020 - 15:50:53
Django version 3.0, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

Lưu ý: Lúc này bạn không cần quan tâm đến cảnh báo về database migrations, chúng ta sẽ sớm giải quyết phần database.

Bạn vừa bắt đầu development server của Django, một web server đơn giản được viết hoàn toàn bằng Python. Web server đã được tích hợp sẵn trong Django, do đó bạn có thể lập trình một cách nhanh chóng, không cần phải “đau đầu” với việc cấu hình production server – chẳng hạn như Apache – cho đến khi bạn sẵn sàng cho production.

Lúc này server đang chạy, hãy truy cập http://127.0.0.1:8000/ bằng trình duyệt web của bạn. Nếu bạn thấy trang “Congratulations!”, với một chiếc tên lửa đang cất cánh, thì chúc mừng bạn đã thành công đến bước này!

Tạo app Polls

Việc thiết lập môi trường localhost đã xong, bây giờ bạn đã có thể bắt tay vào code.

Để tạo app, hãy chắc chắn rằng bạn đang trong cùng thư mục với manage.py, sau đó nhập dòng sau vào command:

$ python manage.py startapp polls

Thư mục polls sẽ được tạo với phần bên trong như sau:

polls/
    __init__.py
    admin.py
    apps.py
    migrations/
        __init__.py
    models.py
    tests.py
    views.py

Cấu trúc thư mục này sẽ chứa app poll.

Tạo view đầu tiên

Mở file polls/views.py và ghi những dòng code sau:

from django.http import HttpResponse


def index(request):
    return HttpResponse("Hello, world. You're at the polls index.")

Đây là view đơn giản nhất trong Django. Để gọi view này, bạn cần khai báo trong file urls.py. Bạn tạo 1 file urls.py trong thư mục /polls như sau:

polls/
    __init__.py
    admin.py
    apps.py
    migrations/
        __init__.py
    models.py
    tests.py
    urls.py
    views.py

Trong file polls/urls.py viết đoạn code sau:

from django.urls import path

from . import views

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

Để app hiểu được những gì bạn vừa viết trong polls/urls.py, bạn cần load file này vào file urls.py ở thư mục gốc (mysite/urls.py) như sau:

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

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

Giải thích về file trên, để load được poll/urls.py vào trong mysite/urls.py thì ta phải thông qua lệnh “include“, muốn sử dụng được lệnh include thì bạn phải import nó từ packages “urls”

Khi nào dùng include()
Bạn nên dùng include() khi bạn cần thêm các URL patterns khác. Riêng admin.site.urls  thì không dùng include() .

Khởi động lại localhost để cập nhật những thay đổi vừa rồi.

$ python manage.py runserver

Truy cập vào http://localhost:8000/polls/ bằng trình duyệt web của bạn, và bạn sẽ thấy dòng chữ “Hello, world. You’re at the polls index.”, cái mà bạn đã ghi trong index view.

Page not found?
Nếu page của bạn bị lỗi chỗ này thì hãy kiểm tra lại để chắc rằng bạn đã truy cập đúng vào http://localhost:8000/polls/, chứ không phải là  http://localhost:8000/.

Đến đây là bạn đã hoàn thành xong phần 1 của series.

Bài viết được dịch từ: https://docs.djangoproject.com/en/3.0/intro/tutorial01/ và có sửa đổi theo ý người dịch.

You can share this post!

Leave a Reply

Your email address will not be published. Required fields are marked *