WSGI và CGI bằng tiếng Anh đơn giản là gì?


126

Mỗi lần tôi đọc WSGI hoặc CGI tôi đều co rúm lại. Tôi đã thử đọc nó trước đây nhưng không có gì thực sự bị mắc kẹt.

Nó thực sự bằng tiếng Anh đơn giản là gì?

Có phải nó chỉ yêu cầu đường ống đến một thiết bị đầu cuối và chuyển hướng đầu ra?


Câu trả lời:


60

WSGI chạy trình thông dịch Python trên máy chủ web bắt đầu, như là một phần của quy trình máy chủ web (chế độ nhúng) hoặc là một quy trình riêng (chế độ daemon) và tải tập lệnh vào nó. Mỗi yêu cầu dẫn đến một chức năng cụ thể trong tập lệnh được gọi, với môi trường yêu cầu được truyền dưới dạng đối số cho hàm.

CGI chạy tập lệnh dưới dạng một quy trình riêng biệt cho mỗi yêu cầu và sử dụng các biến môi trường, stdin và stdout để "giao tiếp" với nó.


15
WSGI! = Mod_wsgi. Ngôn ngữ của bạn đề nghị bạn có nghĩa là mod_wsgi, đây là một triển khai của WSGI. Bản thân WSGI chỉ là một đặc tả và có thể được thực hiện theo nhiều cách khác nhau, bao gồm cả trên CGI.
Graham Dumpleton

@Graham: Bạn có nói rằng không có bộ chứa WSGI nào khác hỗ trợ chạy các ứng dụng WSGI trong các chế độ đó không?
Ignacio Vazquez-Abrams

3
Về mặt kỹ thuật, người ta có thể nói có nhiều biến thể tinh tế hơn chỉ hai biến thể đó, ít nhất là bằng cách các quy trình bắt đầu hoặc cách mã được kích hoạt trong một hệ thống nhúng. Vì vậy, người ta chỉ cần cẩn thận trong việc khái quát mọi thứ thành hai loại đó. Ở cấp độ tổng thể, bạn có thể nói những gì bạn có, nhưng có nhiều thứ hơn thế nếu bạn muốn tìm hiểu sâu về nó.
Graham Dumpleton

1
@GrahamDumpleton, vì tò mò, bạn có phiền giải thích cách WSGI có thể được triển khai trên CGI không?
Yoland

2
Đọc đặc tả WSGI. Nó cho thấy một ví dụ cầu CGI / WSGI. python.org/dev/peps/pep-3333/#the-server-gateway-side Để triển khai mạnh mẽ hơn, hãy xem github.com/GrahamDumpleton/cgi2wsgi Nghiêm túc, nói chung, bạn sẽ muốn tránh CGI.
Graham Dumpleton

255

Từ quan điểm hoàn toàn lùi bước, Blankman, đây là "Trang giới thiệu" của tôi cho Giao diện cổng dịch vụ web:

PHẦN MỘT: DỊCH VỤ WEB

Máy chủ web phục vụ phản hồi lên. Họ ngồi xung quanh, kiên nhẫn chờ đợi, và rồi không có cảnh báo nào cả, đột nhiên:

  • một quá trình khách hàng gửi một yêu cầu. Quá trình khách hàng có thể là một máy chủ web, bot, ứng dụng di động, bất cứ điều gì. Nó chỉ đơn giản là "khách hàng"
  • máy chủ web nhận được yêu cầu này
  • cố tình lẩm bẩm nhiều chuyện xảy ra (xem bên dưới)
  • Máy chủ web gửi lại một cái gì đó cho khách hàng
  • máy chủ web ngồi xung quanh một lần nữa

Các máy chủ web (ít nhất là những máy chủ tốt hơn) rất RẤT giỏi về điều này. Họ mở rộng quy mô lên xuống xử lý tùy theo nhu cầu, họ đáng tin cậy tổ chức các cuộc trò chuyện với khách hàng dễ tính nhất qua các mạng thực sự hỗn độn và chúng tôi không bao giờ thực sự phải lo lắng về điều đó. Họ cứ tiếp tục phục vụ.

Đây là quan điểm của tôi: máy chủ web chỉ là: máy chủ. Họ không biết gì về nội dung, không có gì về người dùng, thực tế không có gì ngoài cách chờ đợi nhiều và trả lời một cách đáng tin cậy.

Sự lựa chọn máy chủ web của bạn sẽ phản ánh sở thích giao hàng của bạn chứ không phải phần mềm của bạn. Máy chủ web của bạn phải chịu trách nhiệm phục vụ, không xử lý hoặc các công cụ logic.

PHẦN THỨ HAI: PHẦN MỀM (PYTHON)

Phần mềm không ngồi xung quanh. Phần mềm chỉ tồn tại tại thời điểm thực hiện. Phần mềm không có sức chứa khủng khiếp khi có những thay đổi bất ngờ trong môi trường của nó (các tệp không nằm ở nơi nó mong đợi, các tham số được đổi tên, v.v.). Mặc dù tối ưu hóa phải là một nguyên lý trung tâm của thiết kế của bạn (tất nhiên), bản thân phần mềm không tối ưu hóa. Nhà phát triển tối ưu hóa. Phần mềm thực thi. Phần mềm thực hiện tất cả nội dung trong phần 'lẩm bẩm có chủ ý' ở trên. Có thể là bất cứ thứ gì.

Sự lựa chọn hoặc thiết kế phần mềm của bạn sẽ phản ánh ứng dụng của bạn, sự lựa chọn chức năng của bạn chứ không phải sự lựa chọn của bạn về máy chủ web.

Đây là nơi mà phương pháp "biên dịch" ngôn ngữ truyền thống đến các máy chủ web trở nên khó khăn. Cuối cùng, bạn đặt mã trong ứng dụng của mình để đối phó với môi trường máy chủ vật lý hoặc, ít nhất, bị buộc phải chọn thư viện 'trình bao bọc' thích hợp để đưa vào thời gian chạy, để tạo ảo giác về tính đồng nhất giữa các máy chủ web.

VẬY WSGI LÀ GÌ?

Vì vậy, cuối cùng, WSGI là gì? WSGI là một bộ quy tắc , được viết thành hai nửa. Chúng được viết theo cách mà chúng có thể được tích hợp vào bất kỳ môi trường nào chào đón sự tích hợp.

Phần đầu tiên, được viết cho phía máy chủ web, nói "OK, nếu bạn muốn xử lý ứng dụng WSGI, đây là cách phần mềm sẽ suy nghĩ khi tải. Dưới đây là những điều bạn phải cung cấp cho ứng dụng và đây là là giao diện (bố cục) mà bạn có thể mong đợi mọi ứng dụng đều có. Hơn nữa, nếu có vấn đề gì xảy ra, đây là cách ứng dụng sẽ suy nghĩ và cách bạn có thể mong đợi nó hoạt động. "

Phần thứ hai, được viết cho phần mềm ứng dụng Python, nói "OK, nếu bạn muốn đối phó với máy chủ WSGI, đây là cách máy chủ sẽ suy nghĩ khi liên lạc với bạn. Dưới đây là những điều bạn phải cung cấp cho máy chủ và Đây là giao diện (bố cục) mà bạn có thể mong đợi mọi máy chủ đều có. Hơn nữa, nếu có gì sai, đây là cách bạn nên cư xử và đây là những gì bạn nên nói với máy chủ. "

Vậy là bạn đã có nó - máy chủ sẽ là máy chủ và phần mềm sẽ là phần mềm, và đây là cách họ có thể hòa hợp với nhau mà không cần phải thực hiện bất kỳ khoản phụ cấp nào cho các chi tiết cụ thể khác. Đây là WSGI.

mod_wsgi, mặt khác, là một plugin cho Apache cho phép nó nói chuyện với phần mềm tuân thủ WSGI, nói cách khác, mod_wsgi là một triển khai - trong Apache - về các quy tắc của phần một của quy tắc trên.

Đối với CGI .... hãy hỏi người khác :-)


21
Thay vì để câu trả lời này kết thúc bằng "hỏi người khác", tôi ước ai đó sẽ chỉnh sửa câu trả lời này để đưa CGI theo cách tương tự.
Bruno Bronosky

1
'Máy chủ sẽ là máy chủ và phần mềm sẽ là phần mềm' - 'máy chủ đến từ sao hỏa và phần mềm là từ venus' :)
Rahul

22

Nếu bạn không rõ ràng về tất cả các điều khoản trong không gian này và hãy đối mặt với nó, đó là một từ viết tắt khó hiểu, thì cũng có một trình đọc nền tốt dưới dạng một con trăn chính thức HOWTO thảo luận về CGI so với FastCGI so với WSGI và vì vậy trên. Tôi ước tôi đã đọc nó trước.


21

Cả CGI và WSGI đều xác định các giao diện chuẩn mà các chương trình có thể sử dụng để xử lý các yêu cầu web. Giao diện CGI ở mức thấp hơn WSGI và liên quan đến việc máy chủ thiết lập các biến môi trường chứa dữ liệu từ yêu cầu HTTP, với chương trình trả về một cái gì đó được định dạng khá giống như phản hồi của máy chủ HTTP.

Mặt khác, WSGI là một giao diện cấp cao hơn một chút dành riêng cho Python, cho phép các lập trình viên viết các ứng dụng không tin tưởng máy chủ và có thể được bọc trong các ứng dụng WSGI khác (phần mềm trung gian).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.