Psssst. BOOTCAMP PHÁT TRIỂN WEB 2023 sẽ bắt đầu vào ngày 01 THÁNG 2 NĂM 2023. Tham gia danh sách chờ, giữ chỗ trong khóa học thuần tập kéo dài 10 tuần của tôi và tìm hiểu các nguyên tắc cơ bản, HTML, CSS, JS, Tailwind, React, Next. jsvà hơn thế nữa. ✨
Python giúp tạo máy chủ HTTP cực kỳ dễ dàng, thông qua mô-đun http
của thư viện chuẩn
Cụ thể, đối tượng http.server
là thứ chúng ta sẽ sử dụng
Trước tiên, tôi muốn đề cập đến một cách nhanh chóng để chạy máy chủ HTTP từ bất kỳ thư mục nào mà không cần viết bất kỳ mã nào
python -m http.server --cgi 8000
Điều này sẽ chạy một máy chủ HTTP trên cổng 8000, phục vụ các tệp trong thư mục hiện tại. Tất nhiên, nó không phải là một máy chủ HTTP có đầy đủ tính năng như Nginx hay Apache, nhưng điều đó thường đủ tốt cho các nguyên mẫu hoặc cho các dự án thử nghiệm của riêng bạn
Bây giờ, hãy sử dụng mô-đun đó trong mã của chúng ta để làm cho nó phục vụ theo chương trình “Xin chào, Thế giới. ” chuỗi tới bất kỳ ai đang kết nối trên cổng 8000
from http.server import BaseHTTPRequestHandler, HTTPServer
class handler[BaseHTTPRequestHandler]:
def do_GET[self]:
self.send_response[200]
self.send_header['Content-type','text/html']
self.end_headers[]
message = "Hello, World!"
self.wfile.write[bytes[message, "utf8"]]
with HTTPServer[['', 8000], handler] as server:
server.serve_forever[]
Sau khi chạy chương trình này cục bộ, bạn có thể thử kết nối bằng trình duyệt Web với cổng http. //máy chủ cục bộ. 8000
Điều này phục vụ cùng một chuỗi Hello, World!
cho bất kỳ ai truy cập trang web trên //localhost:8000
, trên các yêu cầu GET tới bất kỳ URL nào, hoàn thành với phản hồi 200 và tiêu đề Content-type: text/html
Chúng tôi viết thư cho wfile
, chứa luồng đầu ra để viết phản hồi lại cho khách hàng
Nó hoạt động trên các yêu cầu GET vì chúng tôi đã triển khai phương thức xử lý
from http.server import BaseHTTPRequestHandler, HTTPServer
class handler[BaseHTTPRequestHandler]:
def do_GET[self]:
self.send_response[200]
self.send_header['Content-type','text/html']
self.end_headers[]
message = "Hello, World!"
self.wfile.write[bytes[message, "utf8"]]
with HTTPServer[['', 8000], handler] as server:
server.serve_forever[]
0Bạn cũng có thể triển khai
from http.server import BaseHTTPRequestHandler, HTTPServer
class handler[BaseHTTPRequestHandler]:
def do_GET[self]:
self.send_response[200]
self.send_header['Content-type','text/html']
self.end_headers[]
message = "Hello, World!"
self.wfile.write[bytes[message, "utf8"]]
with HTTPServer[['', 8000], handler] as server:
server.serve_forever[]
1, from http.server import BaseHTTPRequestHandler, HTTPServer
class handler[BaseHTTPRequestHandler]:
def do_GET[self]:
self.send_response[200]
self.send_header['Content-type','text/html']
self.end_headers[]
message = "Hello, World!"
self.wfile.write[bytes[message, "utf8"]]
with HTTPServer[['', 8000], handler] as server:
server.serve_forever[]
2 và bất kỳ phương thức HTTP nào khácfrom http.server import BaseHTTPRequestHandler, HTTPServer
class handler[BaseHTTPRequestHandler]:
def do_GET[self]:
self.send_response[200]
self.send_header['Content-type','text/html']
self.end_headers[]
message = "Hello, World! Here is a GET response"
self.wfile.write[bytes[message, "utf8"]]
def do_POST[self]:
self.send_response[200]
self.send_header['Content-type','text/html']
self.end_headers[]
message = "Hello, World! Here is a POST response"
self.wfile.write[bytes[message, "utf8"]]
with HTTPServer[['', 8000], handler] as server:
server.serve_forever[]
Python có rất nhiều thư viện khác nhau mà chúng ta có thể sử dụng để xử lý các ứng dụng được xây dựng trên máy chủ Web, bao gồm Flask và Django rất phổ biến
Bất kể bạn là loại kỹ sư phần mềm nào, tại một thời điểm nào đó trong sự nghiệp của mình, 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áy chủ API cho dịch vụ phụ trợ. Hoặc có thể bạn chỉ đang định cấu hình máy chủ web cho trang web của mình
Trong bài viết này, tôi sẽ trình bày cách tạo máy chủ web http cơ bản nhất trong Python
Nhưng vì tôi muốn đảm bảo rằng bạn hiểu những gì chúng tôi đang xây dựng, trước tiên tôi sẽ giới thiệu tổng quan về máy chủ web là gì và cách chúng hoạt động
Nếu bạn đã biết cách máy chủ web hoạt động, thì bạn có thể
Máy chủ HTTP là gì?
Máy chủ web HTTP không là 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 việc
1- Lắng nghe các yêu cầu http đến trên một địa chỉ ổ cắm TCP cụ thể [địa chỉ IP và số cổng mà tôi sẽ nói sau]
2- Xử lý yêu cầu này và gửi phản hồi lại cho người dùng
Hãy để tôi làm cho quan điểm của tôi ít trừu tượng hơn
Hãy tưởng tượng bạn kéo trình duyệt Chrome lên và nhập www. Yahoo. com trên thanh địa chỉ
Tất nhiên, bạn sẽ nhận được trang chủ Yahoo hiển thị trên cửa sổ trình duyệt của mình
Nhưng những gì thực sự vừa xảy ra dưới mui xe?
Trên thực tế, có rất nhiều điều đã xảy ra và tôi có thể dành cả một bài báo để giải thích điều kỳ diệu đằng sau việc điều này đã xảy ra như thế nào
Nhưng để đơn giản, tôi sẽ lược bỏ một số chi tiết và nói về vấn đề này ở cấp độ rất cao
Ở cấp độ cao, khi bạn gõ www. Yahoo. com trên trình duyệt của bạn, trình duyệt của bạn sẽ tạo một thông báo mạng gọi là yêu cầu HTTP
Yêu cầu này sẽ chuyển đến tận 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 của mình
Mọi tương tác với trang chủ Yahoo sau đó [ví dụ: khi bạn nhấp vào một liên kết] sẽ bắt đầu một yêu cầu mới và phản hồi giống hệt như yêu cầu đầu tiên
Xin nhắc lại, máy nhận yêu cầu http có một quy trình phần mềm được gọi là máy chủ web đang chạy trê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ính xác chức năng của nó 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
Trên 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 viết mã
Hãy để tôi giải thích làm thế nào, nhưng một lần nữa…. ở một cấp độ cao
Địa chỉ ổ cắm TCP
Bất kỳ tin nhắn http nào [dù là yêu cầu hay phản hồi] đều cần biết cách đến được đích của nó
Để đế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à một số cổng
Tôi biết tất cả những từ viết tắt này [TCP, IP, v.v. ] có thể quá sức 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 của mình về các khái niệm mạng, tôi thực sự khuyên bạn nên đọc 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 có tên là DNS
Bạn có muốn kiểm tra xem địa chỉ IP này là gì không?
Dễ dàng. Đi đến thiết bị đầu cuối của bạn và làm như sau
$ host yahoo.com
yahoo.com has address 98.138.219.231
yahoo.com has address 98.137.246.8
yahoo.com has address 98.138.219.232
yahoo.com has address 72.30.35.9
yahoo.com has address 98.137.246.7
yahoo.com has address 72.30.35.10
yahoo.com has IPv6 address 2001:4998:44:41d::3
yahoo.com has IPv6 address 2001:4998:c:1023::5
yahoo.com has IPv6 address 2001:4998:c:1023::4
yahoo.com has IPv6 address 2001:4998:58:1836::10
yahoo.com has IPv6 address 2001:4998:58:1836::11
yahoo.com has IPv6 address 2001:4998:44:41d::4
yahoo.com mail is handled by 1 mta5.am0.yahoodns.net.
yahoo.com mail is handled by 1 mta6.am0.yahoodns.net.
yahoo.com mail is handled by 1 mta7.am0.yahoodns.net.
Như bạn có thể thấy, DNS sẽ dịch yahoo. com đến bất kỳ địa chỉ nào ở trên
Chỉ riêng địa chỉ IP sẽ cho phép thông báo 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, vì vậy mặc dù bạn chưa chỉ định rõ ràng số cổng như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
Bây giờ bạn đã 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ần phải quảng cáo thêm, 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
Python is awesome!
Afternerd
Congratulations! The HTTP Server is working!
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ân phát, 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áy chủ web trong Python 3, bạn cần nhập hai mô-đun. http. máy chủ và máy chủ ổ cắm
Lưu ý rằng trong Python 2, có một mô-đun tên là SimpleHTTPServer. Mô-đun này đã được hợp nhất vào http. máy chủ trong Python 3
Hãy xem mã để tạo một máy chủ http
________số 8_______Cứ như vậy, chúng ta có một máy chủ http chức năng
Bây giờ hãy mổ xẻ 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, địa chỉ TCP được xác định bằng đị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 gửi đến
Các yêu cầu đến này được xử lý bởi các trình xử lý đặc biệt. Bạn có thể coi máy chủ web là bộ điều phối, yêu cầu đến, máy chủ http kiểm tra yêu cầu và gửi nó đến bộ 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ĩ trình xử lý cơ bản nhất là gì?
Chà, đó 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 vào yahoo. com, máy chủ web ở đầu bên kia sẽ gửi lại một tệp html tĩnh
Trên thực tế, đây chính xác là những gì chúng tôi đang cố gắng thực hiện
Và đó, bạn của tôi, là cái mà http. người phục vụ. SimpleHTTPRequestHandler là. 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ề socketserver. Lớp máy chủ TCP
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 TCP]
Để khởi tạo Máy chủ TCP, chúng ta cần hai thứ
1- Địa chỉ TCP [địa chỉ IP và số cổng]
2- Người xử lý
socketserver.TCPServer[["", PORT], Handler]
Như bạn có thể thấy, địa chỉ TCP được truyền dưới dạng một bộ [địa chỉ ip, số cổng]
Chuyển một chuỗi trống làm địa chỉ IP 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ị của 8080, nên máy chủ sẽ lắng nghe các yêu cầu đến trên cổng đó
Đối với trình xử lý, chúng tôi đang chuyển trình xử lý đơn giản mà chúng tôi đã đề cập trước đó
Handler = http.server.SimpleHTTPRequestHandler
Vậy còn serve_forever thì sao?
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 cũng như phản hồi các yêu cầu đến
Thật tuyệt, hãy lưu tệp này dưới dạng máy chủ. py trong cùng thư mục với chỉ mục. html vì theo mặc định SimpleHTTPRequestHandler sẽ tìm một tệp có tên là index. html trong thư mục hiện tại
Trong thư mục đó, khởi động máy chủ web
$ python server.py
serving at port 8080
Bằng cách đó, bây giờ 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 để chờ các yêu cầu http đến
Bây giờ là lúc cho những điều thú vị
Mở trình duyệt của bạn và gõ localhost. 8080 trên thanh địa chỉ
Đáng kinh ngạc. Có vẻ như mọi thứ đều hoạt động tốt
Nhưng này, 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 lắng nghe trên bất kỳ giao diện nào, nên nó cũng đang lắng nghe trên giao diện loopback
Bạn muốn biết địa chỉ IP nào tương ứng với localhost?
bạn hiểu rồi
$ host localhost
localhost has address 127.0.0.1
localhost has IPv6 address ::1
Host localhost not found: 3[NXDOMAIN]
Trên 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 bạn và bạn vẫn nhận được kết quả tương tự
Hãy thử nó ra 🙂
Một lời cuối cùng
Bạn thực sự có thể khởi động một máy chủ web bằng python mà không cần phải viết bất kỳ tập lệnh nào
Chỉ cần truy cập thiết bị đầu cuối của bạn và thực hiện các thao tác sau [nhưng hãy đảm bảo rằng bạn đang sử dụng 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 giao diện cụ thể thì 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 cờ –thư mục để cung cấp các tệp từ một thư mục không nhất thiết phải là thư mục hiện tại.
Vì vậy, câu hỏi bây giờ là, tại sao bạn cần phải viết một tập lệnh khi bạn có thể gọi máy chủ một cách dễ dàng từ thiết bị đầu cuối?
Chà, hãy nhớ rằng bạn đang sử dụng SimpleHTTPRequestHandler. Nếu bạn muốn tạo trình xử lý tùy chỉnh của mình [điều mà bạn có thể sẽ muốn làm] thì bạn sẽ không thể thực hiện việc đó từ thiết bị đầu cuối