WSGI และ CGI ในภาษาอังกฤษล้วนคืออะไร?


127

ทุกครั้งที่ฉันอ่าน WSGI หรือ CGI ฉันประจบประแจง ฉันเคยลองอ่านมาก่อน แต่ไม่มีอะไรติดขัด

มันคืออะไรในภาษาอังกฤษธรรมดา?

เพียงแค่ส่งคำขอไปยังเทอร์มินัลและเปลี่ยนเส้นทางเอาต์พุตหรือไม่?


คำตอบ:


60

WSGI รันตัวแปล Python บนการเริ่มต้นเว็บเซิร์ฟเวอร์ไม่ว่าจะเป็นส่วนหนึ่งของกระบวนการเว็บเซิร์ฟเวอร์ (โหมดฝังตัว) หรือเป็นกระบวนการแยกต่างหาก (โหมด daemon) และโหลดสคริปต์เข้าไป แต่ละคำขอส่งผลให้ฟังก์ชันเฉพาะในสคริปต์ถูกเรียกโดยสภาพแวดล้อมการร้องขอจะส่งผ่านเป็นอาร์กิวเมนต์ไปยังฟังก์ชัน

CGI รันสคริปต์เป็นกระบวนการแยกแต่ละคำขอและใช้ตัวแปรสภาพแวดล้อม stdin และ stdout เพื่อ "สื่อสาร" กับมัน


15
WSGI! = mod_wsgi ภาษาของคุณแนะนำว่าคุณหมายถึง mod_wsgi ซึ่งเป็นการใช้งาน WSGI WSGI นั้นเป็นเพียงข้อกำหนดและสามารถนำไปใช้งานได้หลายวิธีรวมถึง CGI ด้วย
Graham Dumpleton

@Graham: คุณกำลังบอกว่าไม่มีคอนเทนเนอร์ WSGI อื่นที่รองรับการเรียกใช้แอป WSGI ในโหมดเหล่านั้นหรือไม่?
Ignacio Vazquez-Abrams

3
ในทางเทคนิคเราสามารถพูดได้ว่ามีรูปแบบที่ละเอียดอ่อนมากกว่าสองแบบนี้อย่างน้อยก็เท่ากับวิธีเริ่มต้นกระบวนการหรือวิธีเปิดใช้งานโค้ดภายในระบบฝังตัว ดังนั้นเราต้องระมัดระวังในการพูดถึงสิ่งต่างๆให้เป็นสองประเภท ในระดับขั้นต้นคุณอาจบอกว่าคุณมีอะไร แต่มีมากกว่านั้นเล็กน้อยหากคุณต้องการเจาะลึกลงไป
Graham Dumpleton

1
@GrahamDumpleton ด้วยความอยากรู้อยากเห็นคุณช่วยอธิบายว่า WSGI สามารถนำไปใช้กับ CGI ได้อย่างไร?
Yoland

2
อ่านข้อกำหนด WSGI มันแสดงตัวอย่างสะพาน CGI / WSGI python.org/dev/peps/pep-3333/#the-server-gateway-sideสำหรับการใช้งานที่มีประสิทธิภาพยิ่งขึ้นโปรดดูที่github.com/GrahamDumpleton/cgi2wsgiอย่างจริงจังโดยทั่วไปคุณควรหลีกเลี่ยง CGI
Graham Dumpleton

256

จากมุมมองย้อนกลับโดยสิ้นเชิง Blankman นี่คือ "Intro Page" สำหรับ Web Services Gateway Interface:

ส่วนที่หนึ่ง: บริการเว็บ

เว็บเซิร์ฟเวอร์ทำหน้าที่ตอบสนอง พวกเขานั่งรออย่างอดทนและจากนั้นก็ไม่มีการเตือนใด ๆ ทันใดนั้น:

  • กระบวนการไคลเอ็นต์ส่งคำขอ กระบวนการไคลเอ็นต์อาจเป็นเว็บเซิร์ฟเวอร์บอทแอปมือถืออะไรก็ได้ มันเป็นเพียง "ลูกค้า"
  • เว็บเซิร์ฟเวอร์ได้รับคำขอนี้
  • โดยเจตนาพึมพำสิ่งต่างๆเกิดขึ้น (ดูด้านล่าง)
  • เว็บเซิร์ฟเวอร์ส่งบางอย่างกลับไปยังไคลเอนต์
  • เว็บเซิร์ฟเวอร์อยู่อีกครั้ง

เว็บเซิร์ฟเวอร์ (อย่างน้อยก็ยิ่งดี) ดีมากในเรื่องนี้ พวกเขาปรับขนาดการประมวลผลขึ้นและลงตามความต้องการพวกเขาสามารถสนทนากับลูกค้าที่มีปัญหามากที่สุดได้อย่างน่าเชื่อถือผ่านเครือข่ายที่คับแคบจริงๆและเราไม่ต้องกังวลกับมันเลย พวกเขาให้บริการต่อไป

นี่คือประเด็นของฉัน: เว็บเซิร์ฟเวอร์ก็แค่นั้น: เซิร์ฟเวอร์ พวกเขาไม่รู้อะไรเลยเกี่ยวกับเนื้อหาไม่มีอะไรเกี่ยวกับผู้ใช้ไม่มีอะไรนอกเหนือไปจากการรอคอยให้มากและตอบกลับอย่างน่าเชื่อถือ

เว็บเซิร์ฟเวอร์ที่คุณเลือกควรสะท้อนถึงความต้องการในการจัดส่งของคุณไม่ใช่ซอฟต์แวร์ของคุณ เว็บเซิร์ฟเวอร์ของคุณควรรับผิดชอบในการให้บริการไม่ใช่การประมวลผลหรือสิ่งที่เป็นตรรกะ

ส่วนที่สอง: ซอฟต์แวร์ (PYTHON)

ซอฟต์แวร์ไม่ได้นั่งเฉยๆ ซอฟต์แวร์มีอยู่ในเวลาดำเนินการเท่านั้น ซอฟต์แวร์ไม่สามารถรองรับได้มากนักเมื่อมีการเปลี่ยนแปลงที่ไม่คาดคิดในสภาพแวดล้อม (ไฟล์ไม่อยู่ในที่ที่คาดไว้, พารามิเตอร์ถูกเปลี่ยนชื่อเป็นต้น) แม้ว่าการเพิ่มประสิทธิภาพควรเป็นหลักการสำคัญของการออกแบบของคุณ (แน่นอน) แต่ซอฟต์แวร์เองก็ไม่ได้ปรับให้เหมาะสม นักพัฒนาเพิ่มประสิทธิภาพ ซอฟต์แวร์ดำเนินการ ซอฟต์แวร์ดำเนินการทุกอย่างในส่วน 'การพูดพึมพำโดยเจตนา' ด้านบน อาจเป็นอะไรก็ได้

ตัวเลือกหรือการออกแบบซอฟต์แวร์ของคุณควรสะท้อนถึงแอปพลิเคชันของคุณฟังก์ชันการทำงานที่คุณเลือกไม่ใช่เว็บเซิร์ฟเวอร์ที่คุณเลือก

นี่คือจุดที่วิธีดั้งเดิมในการ "รวบรวมภาษา" ไปยังเว็บเซิร์ฟเวอร์กลายเป็นเรื่องยุ่งยาก คุณต้องวางโค้ดลงในแอปพลิเคชันของคุณเพื่อรับมือกับสภาพแวดล้อมเซิร์ฟเวอร์จริงหรืออย่างน้อยก็ถูกบังคับให้เลือกไลบรารี 'wrapper' ที่เหมาะสมเพื่อรวมไว้ในรันไทม์เพื่อให้ภาพลวงตาของความสม่ำเสมอบนเว็บเซิร์ฟเวอร์

WSGI คืออะไร?

ในที่สุด WSGI คืออะไร? WSGI คือชุดของกฎที่เขียนเป็นสองส่วน พวกเขาเขียนในลักษณะที่สามารถรวมเข้ากับสภาพแวดล้อมใด ๆ ที่ยินดีต้อนรับการรวม

ส่วนแรกเขียนไว้สำหรับฝั่งเว็บเซิร์ฟเวอร์ว่า "ตกลงถ้าคุณต้องการจัดการกับแอปพลิเคชัน WSGI นี่คือวิธีคิดของซอฟต์แวร์เมื่อโหลดขึ้นมานี่คือสิ่งที่คุณต้องเตรียมไว้ให้กับแอปพลิเคชันและที่นี่ คืออินเทอร์เฟซ (เค้าโครง) ที่คุณคาดหวังได้ว่าทุกแอปพลิเคชันจะมีนอกจากนี้หากมีอะไรผิดพลาดนี่คือวิธีคิดของแอปและคุณจะคาดหวังให้แอปทำงานได้อย่างไร "

ส่วนที่สองเขียนขึ้นสำหรับซอฟต์แวร์แอปพลิเคชัน Python กล่าวว่า "ตกลงถ้าคุณต้องการจัดการกับเซิร์ฟเวอร์ WSGI นี่คือวิธีที่เซิร์ฟเวอร์จะคิดเมื่อมันติดต่อคุณนี่คือสิ่งที่คุณต้องเตรียมไว้ให้กับเซิร์ฟเวอร์และ นี่คืออินเทอร์เฟซ (เลย์เอาต์) ที่คุณสามารถคาดหวังได้ว่าทุกเซิร์ฟเวอร์จะมีนอกจากนี้หากมีอะไรผิดพลาดนี่คือวิธีที่คุณควรปฏิบัติและนี่คือสิ่งที่คุณควรแจ้งเซิร์ฟเวอร์ "

ดังนั้นคุณมีเซิร์ฟเวอร์จะเป็นเซิร์ฟเวอร์และซอฟต์แวร์จะเป็นซอฟต์แวร์และนี่คือวิธีที่พวกเขาสามารถทำงานร่วมกันได้อย่างยอดเยี่ยมโดยไม่ต้องให้ค่าเผื่อใด ๆ สำหรับข้อมูลจำเพาะของอีกเครื่องหนึ่ง นี่คือ WSGI

mod_wsgi ในทางกลับกันเป็นปลั๊กอินสำหรับ Apache ที่ช่วยให้สามารถพูดคุยกับซอฟต์แวร์ที่รองรับ WSGI กล่าวอีกนัยหนึ่ง mod_wsgi คือการใช้งานใน Apache - ของกฎของส่วนหนึ่งของกฎข้างต้น

ส่วนซีจี .... ขอคนอื่น :-)


21
แทนที่จะให้คำตอบนี้ลงท้ายด้วย "ถามคนอื่น" ฉันหวังว่าจะมีคนแก้ไขคำตอบนี้เพื่อรวม CGI ในลักษณะเดียวกัน
Bruno Bronosky

1
'เซิร์ฟเวอร์จะเป็นเซิร์ฟเวอร์และซอฟต์แวร์จะเป็นซอฟต์แวร์' - 'เซิร์ฟเวอร์มาจากดาวอังคารและซอฟต์แวร์มาจากวีนัส' :)
ราหุล

22

หากคุณไม่ชัดเจนเกี่ยวกับคำศัพท์ทั้งหมดในพื้นที่นี้และลองมาดูกันมันเป็นคำย่อที่ทำให้สับสนนอกจากนี้ยังมีโปรแกรมอ่านพื้นหลังที่ดีในรูปแบบของpython HOWTO อย่างเป็นทางการซึ่งกล่าวถึง CGI กับ FastCGI กับ WSGI เป็นต้น บน. ฉันหวังว่าฉันจะอ่านมันก่อน


21

ทั้ง CGI และ WSGI กำหนดอินเทอร์เฟซมาตรฐานที่โปรแกรมสามารถใช้เพื่อจัดการกับคำขอเว็บ อินเทอร์เฟซ CGI อยู่ในระดับที่ต่ำกว่า WSGI และเกี่ยวข้องกับเซิร์ฟเวอร์ที่ตั้งค่าตัวแปรสภาพแวดล้อมที่มีข้อมูลจากคำขอ HTTP โดยโปรแกรมจะส่งคืนสิ่งที่จัดรูปแบบไว้ค่อนข้างเหมือนกับการตอบสนองของเซิร์ฟเวอร์ HTTP เปล่า

ในทางกลับกัน WSGI เป็นอินเทอร์เฟซเฉพาะของ Python ซึ่งมีระดับสูงกว่าเล็กน้อยซึ่งช่วยให้โปรแกรมเมอร์สามารถเขียนแอปพลิเคชันที่ไม่เชื่อเรื่องพระเจ้าของเซิร์ฟเวอร์และสามารถรวมเข้ากับแอปพลิเคชัน WSGI อื่น ๆ (มิดเดิลแวร์) ได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.