Làm cách nào để sử dụng máy chủ HTTP Python?

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[]
0

Bạ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ác

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! 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ủ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

Máy chủ HTTP hoạt động như thế nào trong Python?

Máy chủ web HTTP chỉ đơn giản là một quá trình chạy trên một máy và lắng nghe các Yêu cầu HTTP đến theo một IP và số Cổng cụ thể, sau đó gửi lại phản hồi cho yêu cầu đó< . .

Python có máy chủ HTTP không?

Python đi kèm với một mô-đun tích hợp được gọi là SimpleHTTPServer , nói cách khác là một máy chủ HTTP đơn giản cung cấp cho bạn các trình xử lý yêu cầu GET và HEAD tiêu chuẩn. Mô-đun này có thể biến bất kỳ thư mục nào trong hệ thống của bạn thành máy chủ web.

Máy chủ HTTP Python có an toàn không?

Cảnh báo http. máy chủ không được khuyến nghị sản xuất . Nó chỉ thực hiện kiểm tra bảo mật cơ bản. Nó không nêu rõ những lỗ hổng bảo mật mà máy chủ gặp phải.

Chủ Đề