Python:Tạo một máy chủ HTTP đơn giản

1815

Bài viết được sự cho phép của tác giả Phạm Văn Nguyên

Web sever có ở khắp mọi nơi.

Cho dù bạn là loại kỹ sư phần mềm nào, tại một số thời điểm trong sự nghiệp, bạn sẽ phải tương tác với các máy chủ web. Có thể bạn đang xây dựng một máy chủ API cho dịch vụ phụ trợ. Hoặc có thể bạn chỉ đang cấu hình một máy chủ web cho trang web của bạn.

  10 Lý do nên học Python trong năm 2020
  11 tip học Python dành cho các “newbie”

Trong bài viết này, tôi sẽ đề cập đến cách tạo máy chủ web http cơ bản nhất trong Python.

Nhưng vì tôi muốn chắc chắn rằng bạn hiểu những gì chúng tôi đang xây dựng, tôi sẽ đưa ra một cái nhìn tổng quan trước tiên về máy chủ web là gì và cách chúng hoạt động.

Nếu bạn đã biết máy chủ web hoạt động như thế nào, thì bạn có thể bỏ qua trực tiếp đến phần này.

Máy chủ HTTP là gì?

Máy chủ web HTTP không có gì ngoài một quy trình đang chạy trên máy của bạn và thực hiện chính xác hai điều:

1- Listen các yêu cầu http đến trên một địa chỉ TCP socket cụ thể (địa chỉ IP và số cổng mà tôi sẽ nói về sau)

2- Xử lý yêu cầu này và gửi phản hồi lại cho người dùng.

Cụ thể thì hãy xem ví dụ sau:

Hãy tưởng tượng bạn kéo trình duyệt Chrome của mình lên và nhập www.yahoo.com  vào thanh địa chỉ.

Python:Tạo một máy chủ HTTP đơn giản

Tất nhiên, bạn sẽ nhận được trang chủ Yahoo được hiển thị trên cửa sổ trình duyệt của bạn.

Nhưng những gì thực sự chỉ xảy ra?

Trên thực tế rất nhiều điều đã xảy ra và tôi có thể dành cả một bài viết để giải thích sự kỳ diệu đằng sau việc này xảy ra như thế nào.

Ở cấp độ cao, khi bạn nhập www.yahoo.com  trên trình duyệt của mình, trình duyệt của bạn sẽ tạo một thông báo mạng được gọi là yêu cầu HTTP .

Yêu cầu này sẽ đi đến tất cả các máy tính Yahoo có máy chủ web đang chạy trên đó. Máy chủ web này sẽ chặn yêu cầu của bạn và xử lý nó bằng cách phản hồi lại bằng html của trang chủ Yahoo.

Cuối cùng, trình duyệt của bạn hiển thị html này trên màn hình và đó là những gì bạn thấy trên màn hình.

Python:Tạo một máy chủ HTTP đơn giản

Mọi tương tác với trang chủ Yahoo sau đó (ví dụ: khi bạn nhấp vào liên kết) sẽ bắt đầu một yêu cầu mới và phản hồi chính xác như yêu cầu đầu tiên.

Để nhắc lại, máy nhận được yêu cầu http có một quy trình phần mềm được gọi là máy chủ web chạy trên nó. Máy chủ web này chịu trách nhiệm chặn các yêu cầu này và xử lý chúng một cách thích hợp .

Được rồi, bây giờ bạn đã biết máy chủ web là gì và chức năng của nó chính xác là gì, bạn có thể tự hỏi làm thế nào để yêu cầu đến được máy yahoo đó ngay từ đầu?

Câu hỏi hay!

Trong thực tế đây là một trong những câu hỏi yêu thích của tôi mà tôi hỏi các ứng viên tiềm năng trong một cuộc phỏng vấn lập trình viên .

Hãy để tôi giải thích làm thế nào, nhưng một lần nữa.

Địa chỉ  TCP socket

Python:Tạo một máy chủ HTTP đơn giản

Bất kỳ tin nhắn http nào (cho dù đó là yêu cầu hay phản hồi) đều cần biết cách đến đích.

Để đến đích, mỗi thông báo http mang một địa chỉ được gọi là địa chỉ TCP đích .

Và mỗi địa chỉ TCP bao gồm một địa chỉ IP và số cổng .

Tôi biết tất cả các từ viết tắt (TCP, IP, v.v.) có thể áp đảo nếu khái niệm mạng của bạn không mạnh.

Tôi sẽ cố gắng làm cho nó đơn giản nhưng nếu bạn quan tâm đến việc nâng cao kiến thức về các khái niệm mạng, tôi đánh giá cao cuốn sách này của Ross và Kurose .

Vậy địa chỉ đó ở đâu khi tất cả những gì bạn đã làm là gõ www.yahoo.com  trên trình duyệt của bạn?

Chà, tên miền này được chuyển đổi thành địa chỉ IP thông qua cơ sở dữ liệu phân tán lớn gọi là DNS .

Bạn có muốn kiểm tra địa chỉ IP này là gì không?

Dễ dàng! Vào cmd trên windows hoặc terminal trên linux và gõ lệnh sau:

ping yahoo.com

Như bạn có thể thấy, DNS sẽ dịch yahoo.com sang bất kỳ địa chỉ nào ở trên.

Chỉ riêng địa chỉ IP sẽ cho phép tin nhắn HTTP đến đúng máy, nhưng bạn vẫn cần số cổng để yêu cầu HTTP đến chính xác máy chủ web.

Nói cách khác, máy chủ web là một ứng dụng mạng thông thường đang lắng nghe trên một cổng cụ thể.

Và yêu cầu http PHẢI được gửi đến cổng đó.

Vậy số cổng ở đâu khi bạn gõ www.yahoo.com ?

Theo mặc định, số cổng là 80 cho http và 443 cho https , do đó, mặc dù bạn chưa chỉ định rõ ràng số cổng, nó vẫn ở đó.

Và nếu máy chủ web đang nghe số cổng không mặc định (không phải 80 hay 443), bạn phải chỉ định rõ ràng số cổng như thế này:

Python:Tạo một máy chủ HTTP đơn giản

Bây giờ bạn sẽ có tất cả các thông tin cần thiết để tạo một máy chủ web http trong Python.

Vì vậy, không có thêm rắc rối, hãy bắt đầu.

Tạo một tệp HTML đơn giản

Đây là những gì chúng tôi muốn làm.

Chúng tôi muốn tạo một máy chủ http đơn giản phục vụ trang web html tĩnh.

Hãy tạo trang html của chúng tôi.

<html>     <head>         <title>Python is awesome!</title>     </head>     <body>         <h1>Nguyenpv.com</h1>         <p>Congratulations! The HTTP Server is working!</p>     </body>      </html>

Bây giờ hãy tiếp tục và lưu tệp này dưới dạng index.html

Với trang web mà chúng tôi muốn phục vụ theo cách khác, bước tiếp theo là tạo một máy chủ web sẽ phục vụ trang html này.

Tạo một máy chủ web HTTP

Để tạo một máy chủ web trong Python 3 , bạn sẽ cần import 2 module: http.server và socketserver

Lưu ý rằng trong Python 2 , có một module có tên  SimpleHTTPServer . Module này đã được hợp nhất vào http.server trong Python 3

Chúng ta hãy xem mã để tạo một máy chủ http

import http.serverimport socketserver PORT = 8080Handler = http.server.SimpleHTTPRequestHandlerwith socketserver.TCPServer(("", PORT), Handler) as httpd:     print("serving at port", PORT)     httpd.serve_forever()

Bây giờ hãy phân tích từng dòng mã này.

Đầu tiên, như tôi đã đề cập trước đó, máy chủ web là một quá trình lắng nghe các yêu cầu đến trên địa chỉ TCP cụ thể.

Và như bạn biết bây giờ, một địa chỉ TCP được xác định bởi một địa chỉ IP và số cổng .

Thứ hai, một máy chủ web cũng cần được cho biết cách xử lý các yêu cầu đến.

Những yêu cầu đến được xử lý bởi các xử lý đặc biệt. Bạn có thể nghĩ về một máy chủ web như một người điều phối, một yêu cầu đến, máy chủ http kiểm tra yêu cầu và gửi nó đến một trình xử lý được chỉ định.

Tất nhiên những người xử lý này có thể làm bất cứ điều gì bạn muốn.

Nhưng bạn nghĩ xử lý cơ bản nhất là gì?

Vâng, đó sẽ là một trình xử lý chỉ phục vụ một tệp tĩnh.

Nói cách khác, khi tôi truy cập yahoo.com , máy chủ web ở đầu kia sẽ gửi lại một tệp html tĩnh.

Đây thực tế là những gì chúng tôi đang cố gắng làm chính xác.

Và đó, bạn của tôi, là http.server.SimpleHTTPRequestHandler là gì: một trình xử lý yêu cầu HTTP đơn giản phục vụ các tệp từ thư mục hiện tại và bất kỳ thư mục con nào của nó.

Bây giờ hãy nói về lớp socketserver.TCPServer .

Một phiên bản của TCPServer mô tả một máy chủ sử dụng giao thức TCP để gửi và nhận tin nhắn (http là giao thức lớp ứng dụng trên đầu TCP).

Để khởi tạo Máy chủ TCP, chúng tôi cần hai điều:

1- Địa chỉ TCP (địa chỉ IP và số cổng)

2- Handler

socketserver.TCPServer(("", PORT), Handler)

Như bạn có thể thấy, địa chỉ TCP được truyền dưới dạng một tuple của (địa chỉ ip, port)

IP bằng rỗng có nghĩa là máy chủ sẽ lắng nghe trên bất kỳ giao diện mạng nào (tất cả các địa chỉ IP có sẵn).

Và vì PORT lưu trữ giá trị 8080, nên máy chủ sẽ lắng nghe các yêu cầu đến trên cổng đó.

Đối với handler, chúng ta đang vượt qua trình xử lý đơn giản mà chúng ta đã nói trước đó.

Handler = http.server.SimpleHTTPRequestHandler

Vâng, làm thế nào về serve_forever ?

Serve_forever là một phương thức trên phiên bản TCPServer khởi động máy chủ và bắt đầu lắng nghe và trả lời các yêu cầu đến.

Thật tuyệt, hãy lưu tệp này dưới dạng server.py trong cùng thư mục với index.html vì theo mặc định, SimpleHTTPRequestHandler sẽ tìm một tệp có tên index.html trong thư mục hiện tại.

Trong thư mục đó, khởi động máy chủ web:

$ python server.py

Bằng cách đó, giờ đây bạn có một máy chủ HTTP đang lắng nghe trên bất kỳ giao diện nào tại cổng 8080 đang chờ các yêu cầu http đến.

Bây giờ là thời gian cho những thứ thú vị!

Mở trình duyệt của bạn và nhập localhost: 8080 vào thanh địa chỉ.

Python:Tạo một máy chủ HTTP đơn giản

Tuyệt vời! Hình như mọi thứ đều hoạt động tốt.

Nhưng localhost là gì?

localhost là tên máy chủ có nghĩa là  máy tính này . Nó được sử dụng để truy cập các dịch vụ mạng đang chạy trên máy chủ thông qua giao diện mạng loopback.

Và vì máy chủ web đang nghe trên bất kỳ giao diện nào , nó cũng đang nghe trên giao diện loopback.

Trong thực tế, bạn hoàn toàn có thể thay thế localhost bằng 127.0.0.1 trong trình duyệt của mình và bạn vẫn sẽ nhận được kết quả tương tự.

Cuối cùng

Bạn thực sự có thể bắt đầu một máy chủ web với python mà không cần phải viết bất kỳ tập lệnh nào.

Chỉ cần vào cmd (windows ) hoặc terminal (linux) trên máy tính của bạn và làm như sau (nhưng hãy chắc chắn rằng bạn đang ở trên python 3)

python -m http.server 8080

Theo mặc định, máy chủ này sẽ lắng nghe trên tất cả các giao diện và trên cổng 8080.

Nếu bạn muốn nghe một giao diện cụ thể, hãy làm như sau:

python -m http.server 8080 --bind 127.0.0.1

Cũng bắt đầu từ Python 3.7, bạn có thể sử dụng -directory cờ để phục vụ tập tin từ một thư mục mà không nhất thiết phải là thư mục hiện hành.

Học Python?

Nếu bạn là người mới bắt đầu,  thì tôi đánh giá cao cuốn sách này.

Không còn là người mới bắt đầu?

Sau đó, đã đến lúc đưa các kỹ năng Python của bạn lên một tầm cao mới  với cuốn sách này

Bài viết gốc được đăng tải tại nguyenpv.com

Có thể bạn quan tâm:

Xem thêm Việc làm Developer hấp dẫn trên TopDev