Tải bản đầy đủ (.docx) (88 trang)

Giới thiệu về Django

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.08 MB, 88 trang )

<span class="text_page_counter">Trang 1</span><div class="page_container" data-page="1">

1. Giới thiệu về Django

“Khuôn khổ web dành cho những người cầu toàn với thờihạn.” Đó là một khẩu hiệu mơ tả chính xác Django, mộtframework đã tồn tại hơn 10 năm nay. Nó đã được thử nghiệmtrong chiến đấu và được sử dụng rộng rãi, với ngày càng nhiềungười sử dụng nó mỗi ngày. Tất cả điều này có thể khiến bạn nghĩrằng Django đã cũ và khơng cịn phù hợp nữa. Ngược lại - tuổi thọcủa nó đã chứng minh rằng API của nó đáng tin cậy và nhất quán,và ngay cả những người đã học Django v1.0 năm 2007 cũng cóthể viết cùng một mã cho Django 4 ngày nay. Django vẫn đangtrong quá trình phát triển tích cực, với các bản sửa lỗi và bản vábảo mật được phát hành hàng tháng.

Giống như Python, ngôn ngữ viết ra Django, Django rất dễhọc nhưng đủ mạnh mẽ và linh hoạt để phát triển theo nhu cầucủa bạn. Đó là một khung “bao gồm pin” - nói cách khác, bạnkhơng cần phải tìm và cài đặt nhiều thư viện hoặc thành phầnkhác để thiết lập và chạy ứng dụng của mình. Các khung khác,chẳng hạn như Flask hoặc Pylons, yêu cầu cài đặt thủ công cáckhung của bên thứ ba để kết nối cơ sở dữ liệu hoặc hiển thị mẫu.Thay vào đó, Django có hỗ trợ tích hợp cho truy vấn cơ sở dữ liệu,ánh xạ URL và hiển thị mẫu (chúng tôi sẽ sớm đi sâu vào chi tiếtvề ý nghĩa của những điều này). Tuy nhiên, chỉ vì Django dễ sửdụng khơng có nghĩa là nó bị hạn chế. Django được nhiều trangweb lớn sử dụng, bao gồm Disqus ( Instagram( Mozilla ( ( OpenStack

</div><span class="text_page_counter">Trang 2</span><div class="page_container" data-page="2">

( và National Geographic( phù hợp với web ở đâu? Khi nói về các khung web,bạn có thể nghĩ đến các khung JavaScript giao diện người dùngnhư ReactJS, Angular hoặc Vue. Các khung này được sử dụng đểnâng cao hoặc thêm tính tương tác cho các trang web đã đượctạo. Django nằm ở lớp bên dưới các cơng cụ này và thay vào đóchịu trách nhiệm định tuyến URL, tìm nạp dữ liệu từ cơ sở dữ liệu,hiển thị mẫu và xử lý dữ liệu nhập vào biểu mẫu từ người dùng.Tuy nhiên, điều này khơng có nghĩa là bạn phải chọn cái này haycái kia; Các khung JavaScript có thể được sử dụng để nâng caođầu ra từ Django hoặc tương tác với API.

Trong cuốn sách này, chúng ta sẽ xây dựng một dự ánDjango bằng cách sử dụng các phương pháp tương tự mà các nhàphát triển Django chuyên nghiệp sử dụng hàng ngày. Ứng dụngnày có tên là Bookr và cho phép bạn duyệt và thêm sách cũngnhư đánh giá sách. Cuốn sách được chia thành bốn phần. Trongphần đầu tiên, chúng ta sẽ bắt đầu với những kiến thức cơ bản vềxây dựng ứng dụng Django, nhanh chóng xây dựng một số trangvà phục vụ chúng với máy chủ phát triển Django. Bạn sẽ có thểthêm dữ liệu vào cơ sở dữ liệu bằng trang quản trị Django.RESTdo Django tạo.

Chương này giới thiệu với bạn về Django và vai trị của nótrong phát triển web. Bạn sẽ bắt đầu bằng cách hiểu cách hoạtđộng của mơ hình mơ hình-khung nhìn-mẫu cũng như cáchDjango xử lý các yêu cầu và phản hồi HTTP. Được trang bị các

</div><span class="text_page_counter">Trang 3</span><div class="page_container" data-page="3">

khái niệm cơ bản, bạn sẽ tạo dự án Django đầu tiên của mình cótên Bookr, một ứng dụng để thêm, xem và quản lý các bài đánhgiá sách. Đó là một ứng dụng mà bạn sẽ tiếp tục nâng cao và bổsung các tính năng xuyên suốt cuốn sách này. Sau đó, bạn sẽ tìmhiểu về lệnh quản lý.py (được sử dụng để sắp xếp các hành độngDjango). Bạn sẽ sử dụng lệnh này để khởi động máy chủ pháttriển Django và kiểm tra xem mã bạn đã viết cho đến nay có hoạtđộng như mong đợi hay khơng. Bạn cũng sẽ học cách làm việc vớiPyCharm, một IDE Python phổ biến mà bạn sẽ sử dụng trong suốtcuốn sách này. Bạn sẽ sử dụng nó để viết mã trả về phản hồi chotrình duyệt web của bạn. Cuối cùng, bạn sẽ tìm hiểu cách sử dụngtrình gỡ lỗi của PyCharm để khắc phục sự cố với mã của mình.Đến cuối chương này, bạn sẽ có những kỹ năng cần thiết để bắtđầu tạo dự án bằng Django. Đến cuối cuốn sách, bạn sẽ có đủkinh nghiệm để thiết kế và xây dựng dự án Django của riêng mìnhtừ đầu đến cuối.

Xây dựng khung sườn cho một dự án và ứng dụng Django

Trước khi đi sâu vào lý thuyết đằng sau mơ hình Django vàcác u cầu HTTP, chúng tơi sẽ cho bạn thấy việc thiết lập vàchạy một dự án Django dễ dàng như thế nào. Sau phần đầu tiênvà bài tập này, bạn sẽ tạo được một dự án Django, gửi u cầu tớidự án đó bằng trình duyệt của bạn và xem phản hồi.

Dự án Django là một thư mục chứa tất cả dữ liệu cho dự áncủa bạn – mã, cài đặt, mẫu và nội dung. Nó được tạo và dàn dựngbằng cách chạy lệnh django-admin trên dòng lệnh với đối số

</div><span class="text_page_counter">Trang 4</span><div class="page_container" data-page="4">

startproject và cung cấp tên dự án. Ví dụ: để tạo một dự ánDjango có tên myproject, lệnh được chạy như sau:

<b>django-admin startproject myproject</b>

Điều này sẽ tạo thư mục myproject, nơi Django chứa các tệpcần thiết để chạy dự án. Bên trong thư mục myproject có hai tệp(thể hiện trong Hình 1.1):

manage.py là tập lệnh Python được thực thi tại dòng lệnh đểtương tác với dự án của bạn. Chúng tơi sẽ sử dụng nó để khởiđộng máy chủ phát triển Django, một máy chủ web phát triển màbạn sẽ sử dụng để tương tác với dự án Django trên máy tính cụcbộ của mình. Giống như django-admin, các lệnh được truyền vàodịng lệnh. Khơng giống như django-admin, tập lệnh này khôngđược ánh xạ trong đường dẫn hệ thống của bạn, vì vậy chúng tơiphải thực thi nó bằng Python. Chúng ta sẽ cần sử dụng dịng lệnhđể làm điều đó. Ví dụ: trong thư mục dự án, chúng tôi chạy lệnhsau:

<b>python3 manage.py runserver</b>

Thao tác này chuyển lệnh runserver tới tập lệnh quản lý.pyđể khởi động Máy chủ Django Dev. Chúng ta sẽ kiểm tra thêm các

</div><span class="text_page_counter">Trang 5</span><div class="page_container" data-page="5">

lệnh mà manage.py chấp nhận sau. Khi tương tác với manager.pytheo cách này, chúng tôi gọi các lệnh quản lý này. Ví dụ: chúngtơi có thể nói rằng chúng tôi đang thực thi lệnh quản lý

Lệnh startproject cũng tạo một thư mục có cùng tên với dựán – trong trường hợp này là myproject. Đây là gói Python chứacác cài đặt và một số tệp cấu hình khác mà dự án của bạn cầnchạy. Chúng ta sẽ xem xét nội dung của nó sau.

Sau khi bắt đầu dự án Django, việc tiếp theo cần làm là khởiđộng ứng dụng Django. Chúng ta nên cố gắng tách dự án Djangocủa mình thành các ứng dụng khác nhau, được nhóm theo chứcnăng. Ví dụ với Bookr chúng ta sẽ có ứng dụng đánh giá. Điều nàysẽ chứa tất cả các mã, HTML, nội dung và các lớp cơ sở dữ liệu cụthể để làm việc với các bài đánh giá sách. Nếu chúng tôi quyếtđịnh mở rộng Bookr để bán sách, chúng tơi có thể thêm một ứngdụng cửa hàng chứa các tệp cho hiệu sách. Ứng dụng được tạobằng lệnh quản lý ứng dụng khởi động, chuyển tên ứng dụng. Đâylà một ví dụ:

<b>python3 manage.py startapp myapp</b>

Điều này tạo ra thư mục ứng dụng (myapp) bên trong thưmục dự án. Django tự động điền vào đây các tệp dành cho ứngdụng đã sẵn sàng để điền vào khi bạn bắt đầu phát triển. Chúngta sẽ kiểm tra các tệp này và thảo luận về điều gì tạo nên mộtứng dụng tốt trong phần ứng dụng Django.

Bây giờ chúng tôi đã giới thiệu các lệnh cơ bản để xây dựngmột dự án và ứng dụng Django, hãy áp dụng chúng vào thực tế

</div><span class="text_page_counter">Trang 6</span><div class="page_container" data-page="6">

bằng cách bắt đầu dự án Bookr trong bài tập đầu tiên của cuốnsách này.

Bài tập 1.01 – tạo dự án và ứng dụng cũng như khởi động máy chủ phát triển

Xuyên suốt cuốn sách này, chúng tôi sẽ xây dựng một trangweb đánh giá sách có tên Bookr. Nó sẽ cho phép bạn thêm cáctrường cho nhà xuất bản, cộng tác viên, sách và bài đánh giá. Nhàxuất bản sẽ xuất bản một hoặc nhiều cuốn sách và mỗi cuốn sáchsẽ có một hoặc nhiều người đóng góp (tác giả, biên tập viên, đồngtác giả, v.v.). Chỉ người dùng quản trị mới được phép sửa đổi cácmô hình này. Khi người dùng đã đăng ký tài khoản trên trang web,họ sẽ có thể bắt đầu thêm đánh giá cho một cuốn sách.

Trong bài tập này, bạn sẽ xây dựng dự án bookr Django,kiểm tra xem Django có đang hoạt động hay khơng bằng cáchchạy máy chủ phát triển, sau đó tạo các bài đánh giá về ứng dụngDjango.

Bạn đã thiết lập sẵn một môi trường ảo với cài đặt Django.Để biết cách thực hiện điều đó, bạn có thể tham khảo Lời nói đầu.Khi bạn đã sẵn sàng, hãy bắt đầu bằng cách tạo dự án Bookr:

1. Mở terminal và chạy lệnh để tạo thư mục dự án bookr và cácthư mục con mặc định:

<b>django-admin startproject bookr</b>

Lệnh này không tạo ra bất kỳ đầu ra nào nhưng sẽ tạo mộtthư mục có tên bookr bên trong thư mục mà bạn đã chạy lệnh.Bạn có thể xem bên trong thư mục này và xem các mục mà

</div><span class="text_page_counter">Trang 7</span><div class="page_container" data-page="7">

chúng tôi đã mô tả trước đây đối với ví dụ về dự án myproject –thư mục gói bookr và tệp quản lý.py.

Bây giờ chúng ta có thể kiểm tra xem dự án và Django cóđược thiết lập chính xác hay không bằng cách chạy máy chủ pháttriển Django. Việc khởi động máy chủ được thực hiện bằng tậplệnh quản lý.py.

2. Trong thiết bị đầu cuối của bạn (hoặc Command Prompt), hãythay đổi sang thư mục dự án bookr (sử dụng lệnh cd), rồi chạylệnh manage.py runserver như sau:

<b>python3 manage.py runserver</b>

GHI CHÚ: Trên Windows, bạn có thể cần chạy và thay thếpython3 chỉ bằng python để lệnh hoạt động mỗi khi bạn chạy nó.

Lệnh này khởi động máy chủ phát triển Django. Bạn sẽ nhậnđược kết quả tương tự như sau:

<b>Watching for file changes with StatReloaderPerforming system checks...</b>

<b>System check identified no issues (0 silenced).</b>

<b>You have 18 unapplied migration(s). Your project may notwork properly until you apply the migrations for app(s):admin, auth, contenttypes, sessions.</b>

<b>Run 'python manage.py migrate' to apply them.January 01, 2022 - 02:54:03</b>

<b>Django version 4.0, using settings 'bookr.settings'Starting development server at http://127.0.0.1:8000/Quit the server with CONTROL-C.</b>

</div><span class="text_page_counter">Trang 8</span><div class="page_container" data-page="8">

Bạn có thể sẽ nhận được một số cảnh báo về việc di chuyểnchưa được áp dụng (unapplied migrations), nhưng hiện tại điều đókhơng sao cả.

3. Mở trình duyệt web và truy cập http://127.0.0.1:8000/, mànhình này sẽ hiển thị cho bạn màn hình chào mừng Django (Hình1.2). Nếu bạn thấy điều này, bạn sẽ biết rằng dự án Django củabạn đã được tạo thành công và hiện tại tất cả đều hoạt động tốt:

4. Quay trở lại thiết bị đầu cuối của bạn và dừng chạy máy chủphát triển bằng cách gõ Ctrl + C.

5. Bây giờ chúng ta sẽ tạo ứng dụng đánh giá cho dự án Bookr.Trong thiết bị đầu cuối của bạn, hãy đảm bảo bạn đang ở trongthư mục dự án bookr, sau đó thực hiện lệnh sau để tạo ứng dụngđánh giá:

<b>python3 manage.py startapp reviews</b>

</div><span class="text_page_counter">Trang 9</span><div class="page_container" data-page="9">

GHI CHÚ: Sau khi tạo ứng dụng đánh giá, các tệp trong thưmục dự án Bookr của bạn sẽ trông như thế này: bookr.Không có đầu ra nếu lệnh thành công nhưng thư mục

<b>reviews </b>đã được tạo. Bạn có thể nhìn vào bên trong thư mục nàyđể xem các tệp đã được tạo – thư mục di chuyển, admin.py,models.py, v.v. Chúng tôi sẽ kiểm tra những điều này một cáchchi tiết trong phần ứng dụng Django.

Trong bài tập này, chúng ta đã tạo dự án Bookr, kiểm traxem dự án có đang hoạt động hay không bằng cách khởi độngmáy chủ phát triển Django, sau đó tạo ứng dụng đánh giá cho dựán. Bây giờ bạn đã có thời gian thực hành với dự án Django,chúng ta sẽ quay lại một số lý thuyết đằng sau thiết kế củaDjango cũng như các u cầu và phản hồi HTTP.

Hiểu mơ hình model-view-template

<b>Một mẫu thiết kế phổ biến trong thiết kế ứng dụng là ModelView Controller (MVC), trong đó mơ hình của ứng dụng (dữ liệu</b>

của nó) được hiển thị trong một hoặc nhiều chế độ xem và bộđiều khiển sắp xếp sự tương tác giữa mơ hình và chế độ xem.Django đi theo một mơ hình khác nhưng tương tự được gọi làModel-View-Template (MVT).

Giống như MVC, MVT cũng sử dụng các mơ hình để lưu trữ dữliệu. Tuy nhiên, với MVT, chế độ xem sẽ truy vấn một mơ hình vàsau đó hiển thị mơ hình đó bằng một mẫu. Thơng thường, với cácngôn ngữ MVC, cả ba thành phần này đều cần được phát triển

</div><span class="text_page_counter">Trang 10</span><div class="page_container" data-page="10">

bằng cùng một ngơn ngữ. Với MVT, mẫu có thể ở ngơn ngữ khác.Trong trường hợp của Django, các mơ hình và chế độ xem đượcviết bằng Python và mẫu được viết bằng HTML. Điều này có nghĩalà nhà phát triển Python có thể làm việc trên các mơ hình và chếđộ xem, trong khi nhà phát triển HTML chuyên nghiệp làm việctrên HTML. Trước tiên, chúng tơi sẽ giải thích chi tiết hơn về cácmơ hình, chế độ xem và mẫu, sau đó xem xét một số tình huốngmẫu nơi chúng được sử dụng.

Mơ hình

Các mơ hình Django xác định dữ liệu cho ứng dụng của bạnvà cung cấp lớp trừu tượng cho quyền truy cập cơ sở dữ liệu SQLthông qua Object Relational Mapper (Trình ánh xạ quan hệ đốitượng (ORM)). ORM cho phép bạn xác định lược đồ dữ liệu (lớp,trường và mối quan hệ của chúng) bằng mã Python mà không cầnhiểu biết về cơ sở dữ liệu cơ bản. Về cơ bản, điều này có nghĩa làbạn có thể xác định lớp cơ sở dữ liệu của mình bằng mã Python vàDjango sẽ đảm nhiệm việc tạo các truy vấn SQL cho bạn. ORM sẽđược thảo luận chi tiết trong Chương 2, Mơ hình và Di chuyển.

GHI CHÚ: SQL là viết tắt của Structured Query Language(Ngôn ngữ truy vấn có cấu trúc) và là cách mơ tả một loại cơ sởdữ liệu lưu trữ dữ liệu trong các bảng, trong đó mỗi bảng có mộtsố hàng. Hãy tưởng tượng mỗi bảng giống như một bảng tínhriêng lẻ. Tuy nhiên, khơng giống như bảng tính, mối quan hệ cóthể được xác định giữa dữ liệu trong mỗi bảng. Bạn có thể tươngtác với dữ liệu bằng cách thực hiện các truy vấn SQL (thường đượcgọi là truy vấn khi nói về cơ sở dữ liệu). Truy vấn cho phép bạn

</div><span class="text_page_counter">Trang 11</span><div class="page_container" data-page="11">

truy xuất dữ liệu (SELECT), thêm hoặc thay đổi dữ liệu (INSERT vàUPDATE) và xóa dữ liệu (DELETE). Có nhiều máy chủ cơ sở dữ liệuSQL để lựa chọn, chẳng hạn như SQLite, PostgreSQL, MySQL hoặcMicrosoft SQL Server. Phần lớn cú pháp SQL giống nhau giữa mỗicơ sở dữ liệu, nhưng có thể có một số khác biệt về phương ngữ.ORM của Django sẽ giải quyết những khác biệt này cho bạn – khibắt đầu viết mã, chúng ta sẽ sử dụng cơ sở dữ liệu SQLite để lưutrữ dữ liệu trên đĩa, nhưng sau đó, khi chúng ta triển khai lên máychủ, chúng tơi sẽ chuyển sang PostgreSQL nhưng không cần thựchiện bất kỳ thay đổi mã nào.

Thông thường, khi truy vấn cơ sở dữ liệu, kết quả trả về dướidạng đối tượng Python nguyên thủy, (ví dụ: danh sách chuỗi, int,float hoặc byte). Khi sử dụng ORM, kết quả sẽ tự động đượcchuyển đổi thành phiên bản của các lớp mơ hình mà bạn đã xácđịnh. Sử dụng ORM có nghĩa là bạn được tự động bảo vệ khỏi mộtloại lỗ hổng được gọi là tấn công tiêm nhiễm SQL.

Nếu bạn quen thuộc hơn với cơ sở dữ liệu và SQL, bạn lncó tùy chọn viết truy vấn của riêng mình.

Chế độ xem

Chế độ xem Django là nơi xác định hầu hết logic cho ứngdụng của bạn. Khi người dùng truy cập trang web của bạn, trìnhduyệt web của họ sẽ gửi yêu cầu truy xuất dữ liệu từ trang webcủa bạn (chúng tôi sẽ đi sâu vào chi tiết hơn về yêu cầu HTTP là gìvà yêu cầu đó chứa thơng tin gì trong phần tiếp theo). Chế độxem là một hàm mà bạn viết sẽ nhận được yêu cầu này dưới dạngđối tượng Python (cụ thể là đối tượng Django HttpRequest). Tùy

</div><span class="text_page_counter">Trang 12</span><div class="page_container" data-page="12">

thuộc vào quan điểm của bạn để quyết định cách nó sẽ đáp ứngu cầu và những gì nó sẽ gửi lại cho người dùng. Chế độ xem củabạn phải trả về một đối tượng HttpResponse đóng gói tất cả thơngtin được cung cấp cho khách hàng – nội dung, trạng thái HTTP vàcác tiêu đề khác.

Chế độ xem cũng có thể tùy chọn nhận thông tin từ URL củayêu cầu - ví dụ: số ID. Mẫu thiết kế phổ biến của chế độ xem làtruy vấn cơ sở dữ liệu thông qua Django ORM, sử dụng ID đượcchuyển vào chế độ xem của bạn. Sau đó, chế độ xem có thể hiểnthị một mẫu (sẽ sớm có nhiều thơng tin hơn về điều này) bằngcách cung cấp cho nó dữ liệu từ mơ hình được lấy từ cơ sở dữ liệu.Mẫu được hiển thị sẽ trở thành nội dung của đối tượngHttpResponse và được trả về từ hàm xem. Django đảm nhiệmviệc truyền dữ liệu trở lại trình duyệt.

Mẫu là tệp Ngơn ngữ đánh dấu siêu văn bản (HTML) (thôngthường - bất kỳ tệp văn bản nào cũng có thể là mẫu) chứa cácphần giữ chỗ đặc biệt được thay thế bằng các biến mà ứng dụngcủa bạn cung cấp. Ví dụ: ứng dụng của bạn có thể hiển thị danhsách các mục theo bố cục thư viện hoặc bố cục bảng. Chế độ xemcủa bạn sẽ tìm nạp các mơ hình giống nhau cho một trong hainhưng có thể hiển thị một tệp HTML khác có cùng thơng tin đểtrình bày dữ liệu theo cách khác nhau. Django nhấn mạnh đến sựan tồn, vì vậy nó sẽ đảm nhiệm việc tự động thốt các biến chobạn. Ví dụ: các ký hiệu < and > (trong số các ký hiệu khác) là cácký tự đặc biệt trong HTML. Nếu bạn cố gắng sử dụng chúng trong

</div><span class="text_page_counter">Trang 13</span><div class="page_container" data-page="13">

một biến thì Django sẽ tự động mã hóa chúng để chúng hiển thịchính xác trong trình duyệt.

MVT trong thực tế

Bây giờ chúng ta sẽ xem xét một số ví dụ để minh họa cáchMVT hoạt động trong thực tế. Trong các ví dụ, chúng ta có mơhình <b>Book </b>lưu trữ thơng tin về các cuốn sách khác nhau và mơhình <b>Review </b>lưu trữ thơng tin về các bài đánh giá khác nhau vềsách.

Trong ví dụ đầu tiên, chúng tơi muốn có thể chỉnh sửa thơngtin về <b>Book </b>hoặc <b>Review </b>. Lấy trường hợp đầu tiên là chỉnh sửachi tiết của một cuốn sách. Chúng ta sẽ có chế độ xem để tìm nạpdữ liệu <b>Book </b>từ cơ sở dữ liệu và cung cấp mơ hình <b>Book</b>. Sau đó,chúng tơi sẽ chuyển thơng tin ngữ cảnh chứa đối tượng <b>Book </b>(vàdữ liệu khác) tới một mẫu hiển thị biểu mẫu để nắm bắt thông tinmới. Kịch bản thứ hai (chỉnh sửa <b>Review </b>) cũng tương tự – tìmnạp mơ hình <b>Review </b>từ cơ sở dữ liệu, sau đó chuyển đối tượng

<b>Review </b>và dữ liệu khác vào một mẫu để hiển thị biểu mẫu chỉnhsửa. Những kịch bản này có thể giống nhau đến mức chúng ta cóthể sử dụng lại cùng một mẫu cho cả hai, như trong Hình 1.3.

</div><span class="text_page_counter">Trang 14</span><div class="page_container" data-page="14">

Bạn có thể thấy ở đây chúng ta sử dụng hai mơ hình, hai chếđộ xem và một mẫu. Mỗi chế độ xem tìm nạp một phiên bản duynhất của mơ hình được liên kết nhưng cả hai đều có thể sử dụngcùng một mẫu, đó là một trang HTML chung để hiển thị biểu mẫu.Chế độ xem có thể cung cấp thêm dữ liệu ngữ cảnh để thay đổimột chút cách hiển thị mẫu cho từng loại mơ hình. Cũng đượcminh họa trong sơ đồ là các phần của mã được viết bằng Pythonvà các phần được viết bằng HTML.

Trong ví dụ thứ hai, chúng tơi muốn có thể hiển thị cho ngườidùng danh sách sách hoặc bài đánh giá được lưu trữ trong ứngdụng. Hơn nữa, chúng tôi muốn cho phép người dùng tìm kiếmsách và nhận danh sách tất cả những cuốn sách phù hợp với tiêuchí của họ. Chúng ta sẽ sử dụng hai mơ hình giống như ví dụ trước(Book and Review) nhưng chúng ta sẽ tạo các chế độ xem và mẫumới. Vì có ba kịch bản nên lần này chúng tôi sẽ sử dụng ba chế độxem – chế độ xem đầu tiên tìm nạp tất cả sách, chế độ xem thứhai tìm nạp tất cả các bài đánh giá và chế độ xem cuối cùng tìmnạp sách dựa trên một số tiêu chí tìm kiếm. Một lần nữa, nếu

</div><span class="text_page_counter">Trang 15</span><div class="page_container" data-page="15">

chúng ta viết tốt một mẫu, chúng ta có thể chỉ sử dụng lại mộtmẫu HTML duy nhất, như trong Hình 1.4.

Các mơ hình Book và Review vẫn khơng thay đổi so với ví dụtrước; ba chế độ xem sẽ lấy nhiều (không hoặc nhiều hơn) sáchhoặc bài đánh giá. Sau đó, mỗi chế độ xem có thể sử dụng cùngmột mẫu, đó là một tệp HTML chung lặp lại danh sách các đốitượng được cung cấp và hiển thị chúng. Một lần nữa, các chế độxem có thể gửi dữ liệu bổ sung trong ngữ cảnh để thay đổi cáchhoạt động của mẫu, nhưng phần lớn mẫu sẽ càng chung chungcàng tốt.

Trong Django, không phải lúc nào cũng cần sử dụng một mơhình để hiển thị mẫu HTML. Một chế độ xem có thể tự tạo dữ liệungữ cảnh và hiển thị một mẫu với nó mà khơng u cầu bất kỳ dữliệu mơ hình nào. Hình 1.5 hiển thị chế độ xem gửi dữ liệu thẳngtới mẫu.

</div><span class="text_page_counter">Trang 16</span><div class="page_container" data-page="16">

Trong ví dụ này, có một chế độ xem chào mừng để chàomừng người dùng đến với trang web. Nó khơng cần bất kỳ thơngtin nào từ cơ sở dữ liệu, vì vậy nó chỉ có thể tự tạo dữ liệu ngữcảnh. Dữ liệu ngữ cảnh phụ thuộc vào loại thơng tin bạn muốnhiển thị – ví dụ: bạn có thể chuyển thơng tin người dùng để chàohọ bằng tên nếu họ đăng nhập.

Chế độ xem cũng có thể hiển thị mẫu mà không cần bất kỳdữ liệu ngữ cảnh nào. Điều này có thể hữu ích nếu bạn có thơngtin tĩnh trong tệp HTML mà bạn muốn cung cấp.

Bây giờ bạn đã được giới thiệu về MVT ở Django, chúng ta cóthể xem cách Django xử lý yêu cầu HTTP và tạo phản hồi HTTP.Tuy nhiên, trước tiên chúng ta cần giải thích chi tiết hơn về yêucầu và phản hồi HTTP là gì cũng như chúng chứa thơng tin gì.Chúng ta sẽ thấy điều này trong phần tiếp theo.

Giới thiệu về HTTP

Giả sử ai đó muốn truy cập trang web của bạn. Họ nhập URLcủa nó hoặc nhấp vào liên kết đến trang web của bạn từ trang họđã truy cập. Trình duyệt web của họ tạo một yêu cầu HTTP, yêucầu này được gửi đến máy chủ lưu trữ trang web của bạn. Khi máychủ web nhận được yêu cầu HTTP từ trình duyệt của bạn, nó cóthể diễn giải yêu cầu đó và sau đó gửi lại phản hồi. Phản hồi màmáy chủ gửi có thể đơn giản, chẳng hạn như chỉ đọc tệp HTML

</div><span class="text_page_counter">Trang 17</span><div class="page_container" data-page="17">

hoặc hình ảnh từ đĩa và gửi nó. Ngồi ra, phản hồi có thể phức tạphơn, có thể sử dụng phần mềm phía máy chủ (chẳng hạn nhưDjango) để tự động tạo nội dung trước khi gửi.

Sơ đồ sau đây hiển thị hướng truyền yêu cầu HTTP và phảnhồi HTTP giữa trình duyệt và máy chủ web.

Yêu cầu được tạo thành từ bốn phần chính – phương thức,đường dẫn, tiêu đề và nội dung (the method, the path, headers,và the body.). Một số loại yêu cầu không có nội dung. Nếu bạn chỉtruy cập một trang web, trình duyệt của bạn sẽ khơng gửi nộidung, trong khi nếu bạn đang gửi biểu mẫu (ví dụ: bằng cáchđăng nhập vào một trang web hoặc thực hiện tìm kiếm), thì ucầu của bạn sẽ có nội dung chứa dữ liệu bạn gửi đi. Bây giờ chúngta sẽ xem xét hai yêu cầu ví dụ để minh họa điều này.

Yêu cầu đầu tiên sẽ đến một trang mẫu có URL sau: Khi trình duyệt của bạn truy cậptrang đó, đây là những gì nó gửi ở hậu trường:

<b>GET /page HTTP/1.1</b>

<b>Host: www.example.com</b>

</div><span class="text_page_counter">Trang 18</span><div class="page_container" data-page="18">

<b>User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:15.0) Firefox/15.0.1</b>

<b>Cookie: sessid=abc123def456</b>

Dòng đầu tiên chứa phương thức (GET) và đường dẫn(/page). Nó cũng chứa phiên bản HTTP – trong trường hợp này là1.1, mặc dù bạn không phải lo lắng về điều này. Có nhiều phươngthức HTTP khác nhau có thể được sử dụng, tùy thuộc vào cáchbạn muốn tương tác với trang từ xa. Một số cách phổ biến là GET(để truy xuất trang từ xa), POST (để gửi dữ liệu đến trang từ xa),PUT (để tạo trang từ xa) và DELETE (để xóa trang từ xa). Lưu ýrằng mô tả về các hành động được đơn giản hóa phần nào – máychủ từ xa có thể chọn cách phản hồi với các phương pháp khácnhau và ngay cả các nhà phát triển có kinh nghiệm cũng có thểkhơng đồng ý về phương pháp chính xác để triển khai cho mộthành động cụ thể. Điều quan trọng cần lưu ý là ngay cả khi máychủ hỗ trợ một phương pháp cụ thể, bạn có thể sẽ cần có quyềnchính xác để thực hiện hành động đó – chẳng hạn, bạn khơng thểxóa một trang web mà bạn khơng thích.

Khi viết một ứng dụng web, phần lớn thời gian bạn sẽ chỉ xửlý các yêu cầu GET. Khi bạn bắt đầu chấp nhận biểu mẫu, bạncũng sẽ phải sử dụng các yêu cầu POST. Chỉ khi bạn đang làmviệc với các tính năng nâng cao, chẳng hạn như tạo API REST, bạnmới phải lo lắng về PUT, DELETE và các phương thức khác.

Quay lại u cầu ví dụ, dịng 2 trở đi có tiêu đề của yêu cầu.Các tiêu đề chứa siêu dữ liệu bổ sung về yêu cầu. Mỗi tiêu đề nằmtrên một dòng riêng, với tên tiêu đề và giá trị của nó được phân

</div><span class="text_page_counter">Trang 19</span><div class="page_container" data-page="19">

tách bằng dấu hai chấm. Hầu hết đều là tùy chọn (ngoại trừ Máychủ - sẽ sớm có thêm thơng tin về điều đó). Tên tiêu đề khơngphân biệt chữ hoa chữ thường. Vì ví dụ này, chúng tơi chỉ hiển thịba tiêu đề phổ biến ở đây. Hãy xem các tiêu đề ví dụ theo thứ tự- Host: Như đã đề cập, đây là tiêu đề duy nhất được yêu cầu (đốivới HTTP 1.1 trở lên). Máy chủ web cần biết trang web hoặc ứngdụng nào sẽ phản hồi yêu cầu nếu có nhiều trang web được lưutrữ trên một máy chủ.

- User-Agent: Trình duyệt của bạn thường gửi đến máy chủ mộtchuỗi xác định phiên bản và hệ điều hành của nó. Ứng dụng máychủ của bạn có thể sử dụng điều này để phân phát các trang khácnhau tới các thiết bị khác nhau (ví dụ: trang dành riêng cho thiếtbị di động dành cho điện thoại thơng minh).

- Cookie: Bạn có thể đã thấy một thông báo khi truy cập mộttrang web cho bạn biết rằng trang web đó đang lưu trữ cookietrong trình duyệt. Đây là những thơng tin nhỏ mà một trang webcó thể lưu trữ trong trình duyệt của bạn và sử dụng để nhận dạngbạn hoặc lưu cài đặt khi bạn quay lại trang web. Nếu bạn thắcmắc về cách trình duyệt của bạn gửi những cookie này trở lại máychủ, thì đó là thơng qua tiêu đề này.

Có nhiều tiêu đề tiêu chuẩn khác được xác định và sẽ chiếmquá nhiều không gian để liệt kê tất cả. Chúng có thể được sử dụngđể xác thực với máy chủ (Authorization), cho máy chủ biết loại dữliệu nào bạn có thể nhận (Accept) hoặc thậm chí ngơn ngữ bạnmuốn cho trang (Accept-Language, mặc dù điều này sẽ chỉ hoạtđộng nếu người tạo trang đã cung cấp nội dung bằng ngôn ngữ cụ

</div><span class="text_page_counter">Trang 20</span><div class="page_container" data-page="20">

thể mà bạn u cầu). Bạn thậm chí có thể xác định các tiêu đềcủa riêng mình mà chỉ ứng dụng của bạn mới biết cách phản hồi.

Bây giờ, hãy xem xét một yêu cầu nâng cao hơn một chút một yêu cầu gửi một số thông tin đến máy chủ và do đó (khơnggiống như ví dụ trước) có chứa nội dung. Trong ví dụ này, chúngtơi đang đăng nhập vào một trang web bằng cách gửi tên ngườidùng và mật khẩu - ví dụ: bạn truy cập và nó sẽ hiển thị một biểu mẫu để nhập tên người dùng vàmật khẩu. Sau khi bạn nhấp vào nút Đăng nhập, đây là yêu cầuđược gửi đến máy chủ:

<b>-POST /login HTTP/1.1Host: www.example.com</b>

<b>Content-Type: application/x-www-form-urlencodedContent-Length: 32</b>

Như bạn có thể thấy, ví dụ này trơng giống với ví dụ đầu tiênnhưng có một vài điểm khác biệt. Phương thức này bây giờ làPOST và hai tiêu đề mới đã được giới thiệu (bạn có thể giả địnhrằng trình duyệt của bạn vẫn sẽ gửi các tiêu đề khác có trong vídụ trước):

- Content-Type: Điều này cho máy chủ biết loại dữ liệu được baogồm trong nội dung. Trong trường hợp ứng dụng/x-www-form-urlencoded, phần thân là một tập hợp các cặp khóa-giá trị. Máykhách HTTP có thể đặt tiêu đề này để thơng báo cho máy chủ biết

</div><span class="text_page_counter">Trang 21</span><div class="page_container" data-page="21">

liệu nó có đang gửi các loại dữ liệu khác hay không, chẳng hạnnhư JSON hoặc XML.

- Content-Length: Để máy chủ biết lượng dữ liệu cần đọc, máykhách phải cho máy chủ biết lượng dữ liệu đang được gửi. Tiêu đềđộ dài nội dung chứa độ dài của phần thân. Nếu bạn đếm chiềudài của phần thân trong ví dụ này, bạn sẽ thấy nó có 32 ký tự.

Các tiêu đề ln được phân tách khỏi phần nội dung bằngmột dòng trống. Bằng cách xem ví dụ, bạn sẽ có thể biết dữ liệubiểu mẫu được mã hóa như thế nào trong phần nội dung -username có giá trị user và password có giá trị pass1.

Những yêu cầu này khá đơn giản nhưng hầu hết các yêu cầuđều không phức tạp hơn nhiều. Chúng có thể có các phương thứcvà tiêu đề khác nhau nhưng phải tuân theo cùng một định dạng.Bây giờ chúng ta đã thấy các yêu cầu, chúng ta sẽ xem xét cácphản hồi HTTP gửi lại từ máy chủ.

Phản hồi HTTP trông giống như một yêu cầu và bao gồm baphần chính – trạng thái, tiêu đề và nội dung (status, headers, vàbody). Tuy nhiên, giống như một yêu cầu, tùy thuộc vào loại phảnhồi, nó có thể khơng có nội dung. Ví dụ về phản hồi đầu tiên làmột phản hồi thành công đơn giản:

<b>HTTP/1.1 200 OKServer: nginx</b>

<b>Content-Length: 18132Content-Type: text/html</b>

<b>Set-Cookie: sessid=abc123def46<!DOCTYPE html><html><head>…</b>

</div><span class="text_page_counter">Trang 22</span><div class="page_container" data-page="22">

Dòng đầu tiên chứa phiên bản HTTP, mã trạng thái dạng số(200) và sau đó là mơ tả văn bản về ý nghĩa của mã đó (OK – yêucầu đã thành công). Chúng ta sẽ hiển thị thêm một số tình huốngsau ví dụ tiếp theo. Dịng 2–5 chứa tiêu đề, tương tự như một yêucầu. Một số cái đầu bạn có thể đã từng thấy trước đây; chúng tơisẽ giải thích tất cả chúng trong bối cảnh này:

- Server: Điều này tương tự nhưng ngược lại với tiêu đề Agent- đây là máy chủ cho khách hàng biết nó đang chạy phầnmềm nào.

User-- ContentUser--Length: Máy khách sử dụng giá trị này để xác địnhlượng dữ liệu cần đọc từ máy chủ để lấy nội dung.

- Content-Type: Máy chủ sử dụng tiêu đề này để cho khách hàngbiết loại dữ liệu nào nó đang gửi. Sau đó, khách hàng có thể chọncách hiển thị dữ liệu - ví dụ: một hình ảnh phải được hiển thị khácvới HTML.

- Set-Cookie: Chúng ta đã thấy trong ví dụ yêu cầu đầu tiên cáchkhách hàng gửi cookie đến máy chủ. Đây là tiêu đề tương ứng màmáy chủ gửi để đặt cookie đó trong trình duyệt.

Sau tiêu đề là một dịng trống và sau đó là phần nội dungcủa phản hồi. Chúng ta chưa hiển thị tất cả ở đây, chỉ một vài kýtự đầu tiên của HTML đang được nhận, trong số 18.132 ký tự màmáy chủ đã gửi.

Tiếp theo, chúng ta sẽ hiển thị ví dụ về phản hồi được trả vềnếu khơng tìm thấy trang được u cầu:

<b>HTTP/1.1 404 Not FoundServer: nginx</b>

</div><span class="text_page_counter">Trang 23</span><div class="page_container" data-page="23">

- 100–199: Máy chủ gửi mã trong phạm vi này để cho biết cácthay đổi về giao thức hoặc cần thêm dữ liệu. Bạn không phải lolắng về những điều này.

- 200–299: Mã trạng thái trong phạm vi này cho biết việc xử lýphản hồi thành công. Như chúng ta đã thấy, mã phổ biến nhất màbạn gặp là 200 OK.

- 300–399: Mã trạng thái trong phạm vi này có nghĩa là trang bạnđang yêu cầu đã chuyển sang địa chỉ khác. Một ví dụ về điều nàylà dịch vụ rút ngắn URL sẽ chuyển hướng bạn từ URL ngắn sangURL đầy đủ khi bạn truy cập nó. Các phản hồi phổ biến là <b>301Moved Permanently</b> hoặc <b>302 Found.</b> Khi gửi phản hồi chuyểnhướng, máy chủ cũng sẽ bao gồm tiêu đề <b>Location </b>chứa URL màbạn sẽ được chuyển hướng đến.

- 400–499: Mã trạng thái trong phạm vi này có nghĩa là yêu cầukhông thể được xử lý do đã xảy ra sự cố với nội dung khách hànggửi. Điều này trái ngược với yêu cầu không thể được xử lý do sựcố trên máy chủ (chúng ta sẽ sớm thảo luận về những vấn đề đó).

</div><span class="text_page_counter">Trang 24</span><div class="page_container" data-page="24">

Chúng tơi đã thấy phản hồi 404 Not Found; Điều này là do ucầu khơng hợp lệ vì khách hàng đang u cầu một tài liệu khôngtồn tại. Một số phản hồi phổ biến khác là 401 Unauthorized (kháchhàng nên đăng nhập) hoặc 403 Forbidden (khách hàng khôngđược phép truy cập vào tài nguyên cụ thể). Cả hai vấn đề này đềucó thể tránh được bằng cách yêu cầu khách hàng đăng nhập, dođó chúng được coi là vấn đề (yêu cầu) phía khách hàng.

- 500–599: Mã trạng thái trong phạm vi này cho biết có lỗi ở phíamáy chủ. Khách hàng khơng nên mong đợi có thể điều chỉnh yêucầu để khắc phục sự cố. Khi làm việc với Django, trạng thái lỗimáy chủ phổ biến nhất bạn sẽ thấy là 500 Internal Server Error.Điều này sẽ được tạo nếu mã của bạn đưa ra một ngoại lệ. Một lỗiphổ biến khác là 504 Gateway Timeout, lỗi này có thể xảy ra nếumã của bạn mất quá nhiều thời gian để chạy. Các biến thể khácthường thấy là 502 Bad Gateway và 503 Service Unavailable,thường có nghĩa là có vấn đề với việc lưu trữ ứng dụng của bạntheo một cách nào đó.

Đây chỉ là một số trạng thái HTTP phổ biến nhất. Bạn có thểtìm thấy danh sách đầy đủ hơn tại Tuynhiên, giống như các tiêu đề HTTP, các trạng thái là tùy ý và ứngdụng có thể trả về các trạng thái tùy chỉnh. Máy chủ và máykhách có quyền quyết định ý nghĩa của các trạng thái và mã tùychỉnh này.

Nếu đây là lần đầu tiên bạn làm quen với giao thức HTTP thìcó khá nhiều thơng tin cần tiếp thu. May mắn thay, Django thực

</div><span class="text_page_counter">Trang 25</span><div class="page_container" data-page="25">

hiện tất cả cơng việc khó khăn đó và đóng gói dữ liệu đến vàomột đối tượng HttpRequest. Trong hầu hết các trường hợp, bạnkhông cần biết về hầu hết thơng tin được cung cấp nhưng thơngtin đó ln sẵn có nếu bạn cần. Tương tự, khi gửi phản hồi, Djangosẽ đóng gói dữ liệu của bạn trong đối tượng HttpResponse. Thôngthường, bạn chỉ cần đặt nội dung trả về nhưng bạn cũng có quyềntự do đặt mã trạng thái và tiêu đề HTTP. Chúng ta sẽ thảo luậncách truy cập và thiết lập thông tin trong HttpRequest vàHttpResponse ở phần sau của chương này. Trong phần tiếp theo,Xử lý yêu cầu, chúng ta sẽ xem cách Django nhận, phân tích cúpháp và phản hồi yêu cầu HTTP.

Xử lý một yêu cầu

Đây là dòng thời gian cơ bản của các luồng yêu cầu và phảnhồi để bạn có thể biết được mã bạn viết sẽ làm gì ở mỗi giai đoạn.Về mặt viết code, phần đầu tiên bạn sẽ viết là quan điểm củabạn. Chế độ xem bạn tạo sẽ thực hiện một số hành động, chẳnghạn như truy vấn cơ sở dữ liệu để tìm dữ liệu. Sau đó, chế độ xemsẽ chuyển dữ liệu này sang một hàm khác để hiển thị mẫu, cuốicùng trả về đối tượng HttpResponse chứa dữ liệu bạn muốn gửi lạicho máy khách.

Tiếp theo, Django cần biết cách ánh xạ một URL cụ thể tớichế độ xem của bạn để nó có thể tải chế độ xem chính xác choURL mà nó nhận được như một phần của yêu cầu. Bạn sẽ viết ánhxạ URL này trong tệp Python cấu hình URL.

Khi Django nhận được u cầu, nó sẽ phân tích tệp cấu hìnhURL và sau đó tìm chế độ xem tương ứng. Nó gọi chế độ xem,

</div><span class="text_page_counter">Trang 26</span><div class="page_container" data-page="26">

truyền vào đối tượng HttpRequest đại diện cho yêu cầu. Chế độxem của bạn sẽ trả về HttpResponse và sau đó Django sẽ tiếp tụcgửi dữ liệu này đến máy chủ web lưu trữ và gửi lại cho khách hàngđã yêu cầu dữ liệu đó

Luồng yêu cầu và phản hồi được minh họa trong Hình 1.7;các phần được chỉ định là Your Code dành cho mã bạn viết và cácbước đầu tiên và cuối cùng do Django đảm nhiệm. Django thựchiện khớp URL cho bạn, gọi mã xem của bạn và sau đó xử lý việcchuyển phản hồi trở lại máy khách.

Trong phần này, chúng ta đã tìm hiểu về cấu trúc của yêucầu và phản hồi HTTP, bao gồm các loại yêu cầu khác nhau được

</div><span class="text_page_counter">Trang 27</span><div class="page_container" data-page="27">

sử dụng cho mục đích gì. Chúng ta cũng đã thấy cách sử dụng mãtrạng thái HTTP để biểu thị lỗi trong các yêu cầu hoặc phản hồiHTTP. Chúng tôi cũng có cái nhìn tổng quan về cách Django cóthể xử lý yêu cầu HTTP. Trong phần tiếp theo, chúng ta sẽ khámphá cấu trúc dự án Django và tìm hiểu xem các tệp và thư mụckhác nhau được sử dụng để làm gì.

Khám phá cấu trúc dự án Django

Chúng ta hãy tự nhắc nhở mình về những gì xảy ra khi chúng tachạy startproject (đối với một dự án có tên myproject) – lệnh tạomột thư mục myproject với một tệp có tên là manager.py và mộtthư mục có tên myproject (cái này khớp với tên dự án; trong Bàitập 1.01 – tạo một dự án và ứng dụng, đồng thời khởi động máychủ phát triển, thư mục này được gọi là bookr, giống như dự án).Bố cục thư mục được hiển thị trong Hình 1.8. Bây giờ chúng ta sẽkiểm tra tệp manage.py và nội dung gói myproject chi tiết hơn.

Đúng như tên gọi, manage.py là tập lệnh được sử dụng đểquản lý dự án Django của bạn. Hầu hết các lệnh được sử dụng để

</div><span class="text_page_counter">Trang 28</span><div class="page_container" data-page="28">

tương tác với dự án của bạn sẽ được cung cấp cho tập lệnh nàytrên dòng lệnh. Các lệnh được cung cấp dưới dạng đối số cho tậplệnh này – ví dụ: nếu chúng ta muốn chạy lệnh manage.pyrunserver, điều đó có nghĩa là chạy tập lệnh manage.py như thếnày:

python3 manage.py runserver

Có một số lệnh hữu ích mà manage.py cung cấp. Bạn sẽđược giới thiệu chi tiết hơn trong suốt cuốn sách; một số lệnh phổbiến như sau:

- runserver: Thao tác này khởi động máy chủ HTTP phát triểnDjango để phục vụ ứng dụng Django trên máy tính cục bộ củabạn.

- startapp: Lệnh này tạo ra một ứng dụng Django mới trong dự áncủa bạn. Chúng ta sẽ sớm nói về ứng dụng chi tiết hơn.

- shell: Thao tác này khởi động trình thơng dịch Python có cài đặtsẵn Django. Điều này hữu ích khi tương tác với ứng dụng của bạnmà không cần phải tải cài đặt Django theo cách thủ công.

- dbshell: Thao tác này khởi động một shell tương tác được kết nốivới cơ sở dữ liệu của bạn, sử dụng các tham số mặc định từ càiđặt Django của bạn. Bạn có thể chạy các truy vấn SQL thủ côngtheo cách này.

- makemigrations: Thao tác này tạo ra hướng dẫn thay đổi cơ sởdữ liệu từ định nghĩa mơ hình của bạn. Bạn sẽ tìm hiểu ý nghĩacủa lệnh này và cách sử dụng lệnh này trong Chương 2, Mơ hìnhvà Di chuyển.

</div><span class="text_page_counter">Trang 29</span><div class="page_container" data-page="29">

- migrate: Thao tác này áp dụng các di chuyển được tạo bởi lệnhmakemigrations. Bạn cũng sẽ sử dụng điều này trong Chương 2,Mơ hình và Di chuyển.

- test: Thao tác này chạy các bài kiểm tra tự động mà bạn đã viết.Bạn sẽ sử dụng lệnh này trong Chương 14, Kiểm tra ứng dụngDjango của bạn.

Danh sách đầy đủ các lệnh có sẵn trong các phần sau, chúng ta sẽ khám phá nội dung của thưmục dự án, tìm hiểu thư mục ứng dụng Django chứa gì và xemcách tải dự án của bạn lên PyCharm.

Thư mục myproject

Cũng như tệp manage.py, mục tệp khác được tạo bởistartproject là thư mục myproject. Đây là gói Python thực tế chodự án của bạn. Nó chứa các cài đặt cho dự án, một số tệp cấuhình cho máy chủ web của bạn và bản đồ URL chung. Bên trongthư mục myproject có năm tệp:

Chúng ta có thể thấy các tệp này trong hình dưới đây:

</div><span class="text_page_counter">Trang 30</span><div class="page_container" data-page="30">

Giờ tình hiểu các tệp này chứa gì:

__init__.py: Đây là một tệp trống cho Python biết rằng thư mụcmyproject là một mô-đun Python. Bạn sẽ quen với những tệp nàynếu trước đây bạn đã từng làm việc với Python.

- settings.py: tệp này chứa tất cả các cài đặt Django cho ứng dụngcủa bạn. Chúng ta sẽ giải thích nội dung sớm.

- urls.py: tệp này có ánh xạ URL chung mà ban đầu Django sẽ sửdụng để định vị các chế độ xem hoặc ánh xạ URL con khác. Bạnsẽ sớm thêm ánh xạ URL vào tệp này.

- asgi.py và wsgi.py: Những tệp này là những gì máy chủ webASGI hoặc WSGI sử dụng để liên lạc với ứng dụng Django của bạnkhi bạn triển khai nó lên máy chủ web sản xuất. Thông thường,bạn không cần phải chỉnh sửa những thứ này và chúng khơngđược sử dụng trong q trình phát triển hàng ngày.

Máy chủ phát triển Django

Bạn đã khởi động máy chủ phát triển Django trong Bài tập1.01 – tạo một dự án và ứng dụng, đồng thời khởi động máy chủ

</div><span class="text_page_counter">Trang 31</span><div class="page_container" data-page="31">

phát triển. Như chúng ta đã đề cập trước đây, đây là một máy chủweb chỉ được chạy trên máy của nhà phát triển trong q trìnhphát triển. Nó khơng được thiết kế để sử dụng trong sản xuất.By default, the server listens on port 8000 on localhost(127.0.0.1), but this can be changed by adding a port number, oraddress and port number, after the runserver argument:

Theo mặc định, máy chủ lắng nghe cổng 8000 trên localhost(127.0.0.1), nhưng điều này có thể được thay đổi bằng cách thêmsố cổng hoặc địa chỉ và số cổng vào sau đối số máy chủ:

python3 manage.py runserver 8001

Lệnh trên sẽ khiến máy chủ lắng nghe trên cổng 8001 trênlocalhost (127.0.0.1).

Bạn cũng có thể yêu cầu nó nghe trên một địa chỉ cụ thể nếumáy tính của bạn có nhiều địa chỉ hoặc 0.0.0.0 cho tất cả các địachỉ:

python3 manage.py runserver 0.0.0.0:8000

Lệnh này sẽ yêu cầu máy chủ lắng nghe tất cả các địa chỉmáy tính của bạn trên cổng 8000, điều này có thể hữu ích nếubạn muốn kiểm tra ứng dụng của mình từ một máy tính khác hoặcđiện thoại thông minh của bạn.

Máy chủ phát triển theo dõi thư mục dự án Django của bạnvà sẽ tự động khởi động lại mỗi khi bạn lưu tệp để mọi thay đổimã bạn thực hiện sẽ tự động được tải lại vào máy chủ. Tuy nhiên,bạn vẫn phải làm mới trình duyệt của mình theo cách thủ cơng đểxem những thay đổi ở đó.

</div><span class="text_page_counter">Trang 32</span><div class="page_container" data-page="32">

Khi bạn muốn dừng lệnh runserver, bạn có thể thực hiệntheo cách thông thường để dừng các tiến trình trong terminal –bằng cách gõ Ctrl + C.

<small>Ứng dụng Django</small>

Bây giờ chúng ta đã đề cập đến hầu hết lý thuyết về ứngdụng, chúng ta có thể cụ thể hơn về mục đích của chúng. Thưmục ứng dụng chứa tất cả các mơ hình, chế độ xem, mẫu (và hơnthế nữa) mà chúng ta cần để cung cấp chức năng cho ứng dụng.Một dự án Django sẽ chứa ít nhất một ứng dụng (trừ khi nó đượctùy chỉnh nhiều để khơng phụ thuộc vào chức năng của Django).Nếu được thiết kế tốt, ứng dụng sẽ có thể bị xóa khỏi dự án vàchuyển sang dự án khác mà không cần sửa đổi. Thông thường,một ứng dụng sẽ chứa các mơ hình cho một miền thiết kế duynhất và đây có thể là cách hữu ích để xác định xem ứng dụng củabạn có nên được chia thành nhiều ứng dụng hay không.

Ứng dụng của bạn có thể có bất kỳ tên nào miễn là tên đun Python hợp lệ (tức là chỉ các chữ cái, số và dấu gạch dưới) vàkhông xung đột với các tệp khác trong thư mục dự án của bạn. Vídụ, như chúng ta đã thấy, đã có sẵn một thư mục có tênmyproject trong thư mục dự án (chứa tệp settings.py), vì vậy bạnkhơng thể có ứng dụng có tên myproject. Như chúng ta đã thấytrong Bài tập 1.01 – tạo một dự án và ứng dụng, đồng thời khởiđộng máy chủ phát triển, việc tạo một ứng dụng sử dụngmanage.py startapp appname, như được hiển thị ở đây:

mô-python3 manage.py startapp myapp

</div><span class="text_page_counter">Trang 33</span><div class="page_container" data-page="33">

Lệnh startapp tạo một thư mục trong dự án của bạn với tênứng dụng được chỉ định. Nó cũng tạo ra các tập tin cho ứng dụng.Bên trong thư mục ứng dụng có một số tệp và một thư mục, nhưtrong Hình 1.10:

Chúng ta hãy xem qua các tập tin và một thư mục này:

- __init.py__: Một tệp trống, cho biết thư mục này là mơ-đunPython.

- admin.py: Django có trang quản trị tích hợp để xem và chỉnh sửadữ liệu bằng GUI. Trong tệp này, bạn sẽ xác định cách hiển thị cácmơ hình ứng dụng của mình trong trang quản trị Django.

- apps.py: Phần này chứa một số cấu hình cho siêu dữ liệu củaứng dụng của bạn. Bạn sẽ không cần chỉnh sửa tập tin này.

- models.py: Đây là nơi bạn sẽ xác định các mơ hình cho ứng dụngcủa mình.

- migrations: Django sử dụng các tệp di chuyển để tự động ghi lạicác thay đổi đối với cơ sở dữ liệu cơ bản của bạn khi mơ hình thay

</div><span class="text_page_counter">Trang 34</span><div class="page_container" data-page="34">

đổi. Chúng được tạo bởi Django khi bạn chạy lệnh manage.pymakemigrations và được lưu trữ trong thư mục này. Chúng khôngđược áp dụng vào cơ sở dữ liệu cho đến khi bạn chạy manage.pymigrate.

- test.py: Để kiểm tra xem mã của bạn có hoạt động chính xáchay khơng, Django hỗ trợ viết các bài kiểm tra (đơn vị, chức nănghoặc tích hợp) và sẽ tìm kiếm chúng trong tệp này. Chúng tôi sẽviết một số bài kiểm tra trong suốt cuốn sách này và đề cập chitiết về việc kiểm tra trong Chương 14, Kiểm tra ứng dụng Djangocủa bạn.

- view.py: Chế độ xem Django của bạn (mã đáp ứng yêu cầuHTTP) sẽ xuất hiện ở đây. Bạn sẽ sớm tạo chế độ xem cơ bản vàcác chế độ xem sẽ được đề cập chi tiết hơn trong Chương 3, Ánhxạ URL, Chế độ xem và Mẫu.

Chúng ta sẽ kiểm tra nội dung của các tệp này chi tiết hơn ,nhưng hiện tại, chúng tôi sẽ thiết lập và chạy PyCharm.

<small>Thiết lập PyCharm</small>

Chúng tôi đã xác nhận trong Bài tập 1.01 – tạo dự án và ứngdụng, đồng thời khởi động máy chủ phát triển rằng dự án Bookrđã được thiết lập đúng cách (vì máy chủ phát triển chạy thànhcơng), vì vậy bây giờ chúng tơi có thể bắt đầu sử dụng PyCharmđể chạy và chỉnh sửa dự án của mình. PyCharm là một IDE đểphát triển Python và bao gồm các tính năng như hoàn thành mã,định dạng kiểu tự động và trình gỡ lỗi tích hợp. Sau đó, chúng tơisẽ sử dụng PyCharm để bắt đầu viết bản đồ URL, chế độ xem vàmẫu của riêng mình. Nó cũng sẽ được sử dụng để khởi động và

</div><span class="text_page_counter">Trang 35</span><div class="page_container" data-page="35">

dừng máy chủ phát triển, điều này sẽ cho phép gỡ lỗi mã của bạnbằng cách đặt các điểm dừng.

<small>Bài tập 1.02 – thiết lập dự án trong PyCharm</small>

Trong bài tập này, chúng ta sẽ mở dự án Bookr trongPyCharm và thiết lập trình thơng dịch dự án để PyCharm có thểchạy và gỡ lỗi dự án. Thực hiện theo các bước sau:

1. Mở PyCharm. Khi bạn mở PyCharm lần đầu tiên, bạn sẽ thấymàn hình Welcome to PyCharm hỏi bạn muốn làm gì:

2. Bấm vào Open, sau đó duyệt đến dự án bookr bạn vừa tạo, sauđó mở nó. Hãy chắc chắn rằng bạn đang mở thư mục dự án bookrchứ khơng phải thư mục gói bookr bên trong.

</div><span class="text_page_counter">Trang 36</span><div class="page_container" data-page="36">

3. Bạn sẽ được hỏi liệu bạn có muốn tin tưởng vào dự án bookrhay khơng. Vì mới tạo nên an tồn nên click vào Trust Project:

Nếu trước đây bạn chưa sử dụng PyCharm, nó sẽ hỏi bạn vềcài đặt và chủ đề nào bạn muốn sử dụng và khi bạn đã trả lời tấtcả những câu hỏi đó, bạn sẽ thấy cấu trúc dự án bookr của mìnhmở trong ngăn Project ở bên trái cửa sổ :

</div><span class="text_page_counter">Trang 37</span><div class="page_container" data-page="37">

Figure 1.13 – The PyCharm project pane

Khung dự án của bạn sẽ trông giống như Hình 1.13 và hiểnthị các thư mục bookr và reviews cũng như tệp manage.py. Nếubạn không thấy những thứ này mà thay vào đó là asgi.py,settings.py, urls.py và wsgi.py thì thay vào đó bạn đã mở thư mụcgói bookr. Chọn File | Open, sau đó duyệt và mở thư mục dự ánbookr

Trước khi PyCharm biết cách thực thi dự án của bạn để khởiđộng máy chủ phát triển Django, trình thơng dịch phải được đặtthành nhị phân Python bên trong môi trường ảo của bạn. Việc nàyđược thực hiện trước tiên bằng cách thêm trình thơng dịch vào càiđặt trình thơng dịch chung.

</div><span class="text_page_counter">Trang 38</span><div class="page_container" data-page="38">

4. Mở cửa sổ Preferences (macOS) hoặc Settings (Windows/Linux)bên trong PyCharm:

macOS: PyCharm menu | PreferencesWindows và Linux: File | Settings

5. Trong ngăn danh sách tùy chọn ở bên trái, mở mục Project:bookr rồi bấm vào Project Interpreter:

6. Đơi khi, PyCharm có thể tự động xác định mơi trường ảo, vì vậytrong trường hợp này, trình thơng dịch dự án có thể đã được cungcấp trình thơng dịch chính xác. Nếu có và bạn thấy Django trongdanh sách các gói, hãy nhấp vào OK để đóng cửa sổ và hồnthành bài tập này.

7. Tuy nhiên, trong hầu hết các trường hợp, trình thông dịchPython phải được đặt thủ công. Nhấp vào biểu tượng răng cưa bêncạnh trình đơn thả xuống Python Interpreter, sau đó nhấp vàoAdd… .

</div><span class="text_page_counter">Trang 39</span><div class="page_container" data-page="39">

8. Cửa sổ Add Python Interpreter được hiển thị. Chọn nút radioExisting environment, sau đó bấm vào dấu chấm lửng (…) bêncạnh lựa chọn Interpreter. Sau đó, bạn nên duyệt và chọn trìnhthơng dịch Python cho mơi trường ảo của mình.

9. Trên macOS (giả sử bạn gọi là môi trường ảo bookr ), đường

/Users/ben/.virtualenvs/bookr/bin/python3

</div><span class="text_page_counter">Trang 40</span><div class="page_container" data-page="40">

Trên Windows, nó sẽ ở bất cứ nơi nào bạn tạo mơi trường ảo củamình bằng lệnh virtualenv.

Sau khi chọn trình thơng dịch, cửa sổ Add Python Interpreter củabạn sẽ giống như Hình 1.15.

11. Bấm OK để đóng cửa sổ Add Python Interpreter.

Bây giờ bạn sẽ thấy cửa sổ tùy chọn chính và Django (và các góikhác trong môi trường ảo của bạn) sẽ được liệt kê (xem Hình1.16).

12. Bấm OK trong cửa sổ Preferences chính để đóng nó. PyCharmbây giờ sẽ mất vài giây để lập chỉ mục môi trường của bạn và cácthư viện được cài đặt. Bạn có thể xem q trình này ở thanh trạngthái phía dưới bên phải của nó. Đợi quá trình này kết thúc vàthanh tiến trình sẽ biến mất.

</div>

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×