อ่าน 6 นาที
อินเทอร์เฟซเกตเวย์เว็บเซิร์ฟเวอร์
อิน เทอร์เฟซเกตเวย์เว็บเซิร์ฟเวอร์ ( WSGI ออกเสียงว่า whiskey [ 1 ] [ 2 ] หรือ WIZ -ghee [ 3 ] ) เป็น ข้อกำหนดการเรียกที่ เรียบง่าย สำหรับ เว็บเซิร์ฟเวอร์ ในการส่งต่อคำขอไปยัง...
อินเทอร์เฟซเกตเวย์เว็บเซิร์ฟเวอร์
อินเทอร์เฟซเกตเวย์เว็บเซิร์ฟเวอร์ ( WSGIออกเสียงว่าwhiskey [ 1 ] [ 2 ]หรือWIZ -ghee [ 3 ] ) เป็นข้อกำหนดการเรียกที่ เรียบง่าย สำหรับเว็บเซิร์ฟเวอร์ในการส่งต่อคำขอไปยังเว็บแอป พลิเคชัน หรือเฟรมเวิร์กที่เขียนด้วยภาษาการเขียนโปรแกรม Pythonเวอร์ชันปัจจุบันของ WSGI เวอร์ชัน 1.0.1 ได้รับการกำหนดไว้ในPython Enhancement Proposal (PEP) 3333 [ 4 ]
WSGI ได้รับการกำหนดไว้ครั้งแรกใน PEP-333 ในปี 2546 [ 5 ] PEP-3333 ซึ่งเผยแพร่ในปี 2553 ได้ปรับปรุงข้อกำหนดสำหรับPython 3
พื้นหลัง
ในปี พ.ศ. 2546 เฟรมเวิร์กเว็บ Python มักจะเขียนขึ้นโดยใช้CGI , FastCGI , mod_pythonหรือAPI แบบกำหนดเองอื่นๆ ของเว็บเซิร์ฟเวอร์เฉพาะเท่านั้น[ 6 ] อ้างอิงจาก PEP 333:
ปัจจุบัน Python มีเฟรมเวิร์กสำหรับการพัฒนาเว็บแอปพลิเคชันให้เลือกมากมาย เช่น Zope, Quixote, Webware, SkunkWeb, PSO และ Twisted Web เป็นต้น ความหลากหลายของตัวเลือกนี้อาจเป็นปัญหาสำหรับผู้ใช้ Python มือใหม่ เพราะโดยทั่วไปแล้ว ตัวเลือกเฟรมเวิร์กเว็บของพวกเขาจะจำกัดตัวเลือกเว็บเซิร์ฟเวอร์ที่ใช้งานได้ และในทางกลับกัน... ในทางตรงกันข้าม แม้ว่า Java จะมีเฟรมเวิร์กสำหรับการพัฒนาเว็บแอปพลิเคชันให้เลือกมากพอๆ กัน แต่ API "servlet" ของ Java ทำให้แอปพลิเคชันที่เขียนด้วยเฟรมเวิร์กเว็บแอปพลิเคชันของ Java ใดๆ ก็สามารถทำงานบนเว็บเซิร์ฟเวอร์ใดๆ ที่รองรับ API servlet ได้
WSGI จึงถูกสร้างขึ้นเป็นอินเทอร์เฟซ ที่เป็นกลางต่อการใช้งาน ระหว่างเว็บเซิร์ฟเวอร์และเว็บแอปพลิเคชันหรือเฟรมเวิร์กเพื่อส่งเสริมพื้นฐานร่วมกันสำหรับการพัฒนาเว็บแอปพลิเคชันแบบพกพา[ 4 ]
ภาพรวมข้อมูลจำเพาะ
WSGI มีสองด้าน:
- ฝั่ง เซิร์ฟเวอร์/เกตเวย์ มักจะใช้ซอฟต์แวร์เว็บเซิร์ฟเวอร์แบบเต็มรูปแบบ เช่นApacheหรือNginx หรือ อาจ เป็นแอปพลิเคชันเซิร์ฟเวอร์ขนาดเล็กที่สามารถสื่อสารกับเว็บเซิร์ฟเวอร์ ได้เช่นflup
- ฝั่งแอปพลิเคชัน/เฟรมเวิร์ก นี่คือฟังก์ชันที่เรียกได้ในภาษา Python ซึ่งจัดเตรียมโดยโปรแกรม Python หรือเฟรมเวิร์กนั้น
ระหว่างเซิร์ฟเวอร์และแอปพลิเคชัน อาจมีส่วนประกอบมิดเดิลแวร์ WSGI อย่างน้อยหนึ่งตัว ซึ่งทำหน้าที่ใช้งาน API ทั้งสองฝั่ง โดยทั่วไปจะเขียนด้วยโค้ด Python
WSGI ไม่ได้ระบุวิธีการเริ่มต้นตัวแปลภาษา Python หรือวิธีการโหลดหรือกำหนดค่าอ็อบเจ็กต์แอปพลิเคชัน และเฟรมเวิร์กและเว็บเซิร์ฟเวอร์ต่างๆ ก็ดำเนินการในส่วนนี้ด้วยวิธีการที่แตกต่างกันไป
มิดเดิลแวร์ WSGI
ส่วนประกอบมิดเดิลแวร์ WSGI คือฟังก์ชัน Python ที่สามารถเรียกใช้งานได้ ซึ่งตัวมันเองเป็นแอปพลิเคชัน WSGI แต่สามารถจัดการคำขอโดยการมอบหมายให้กับแอปพลิเคชัน WSGI อื่นๆ แอปพลิเคชันเหล่านี้สามารถเป็นส่วนประกอบมิดเดิลแวร์ WSGI ได้เช่นกัน[ 7 ]
ส่วนประกอบมิดเดิลแวร์สามารถทำหน้าที่ต่างๆ ได้ดังนี้: [ 7 ]
- การกำหนดเส้นทางการร้องขอไปยังอ็อบเจ็กต์แอปพลิเคชันต่างๆ โดยอิงตาม URLเป้าหมายหลังจากเปลี่ยนแปลงตัวแปรสภาพแวดล้อมให้เหมาะสมแล้ว
- อนุญาตให้แอปพลิเคชันหรือเฟรมเวิร์กหลายตัวทำงานควบคู่กันไปในกระบวนการ เดียวกัน
- การกระจายภาระงานและการประมวลผลระยะไกล โดยการส่งต่อคำขอและการตอบกลับผ่านเครือข่าย
- การประมวลผลเนื้อหาหลังการอัปโหลด เช่น การใช้สไตล์ชีตXSLT
ตัวอย่าง
ตัวอย่างการใช้งาน
แอปพลิเคชัน " Hello, World! " ที่เข้ากันได้กับ WSGI ซึ่งเขียนด้วยภาษา Python :
def application ( environ , start_response ):start_response ( "200 OK" , [( "Content-Type" , "text/plain" )])แสดงผลb "สวัสดีโลก! \n "ที่ไหน:
- บรรทัดที่ 1 กำหนดฟังก์ชัน[ 8 ]ที่ชื่อว่า
applicationซึ่งรับพารามิเตอร์สองตัว คือและenvironเป็นพจนานุกรมที่มีตัวแปรสภาพแวดล้อม CGIรวมถึงพารามิเตอร์คำขอและข้อมูลเมตาอื่นๆ ภายใต้คีย์ที่กำหนดไว้อย่างดี[ 9 ]เป็นฟังก์ชันที่เรียกได้เอง โดยรับพารามิเตอร์ตำแหน่งสองตัวคือและstart_responseenvironstart_responsestatusresponse_headers - บรรทัดที่ 2 เรียกใช้ฟังก์ชัน
start_responseโดยระบุสถานะ HTTP เป็น "200 OK" และส่วนหัวการตอบกลับเป็น "Content-Type" - บรรทัดที่ 3 เปลี่ยนฟังก์ชันให้เป็นตัวสร้าง (generator ) ส่วนเนื้อหาของคำตอบจะถูกส่งกลับเป็นสตริงไบต์ที่สามารถวนซ้ำได้ (iterable of byte strings )
ตัวอย่างการเรียกใช้งานแอปพลิเคชัน
ตัวอย่างเต็มรูปแบบของเซิร์ฟเวอร์เครือข่าย WSGI อยู่นอกขอบเขตของบทความนี้ ด้านล่างนี้เป็นภาพร่างของวิธีการเรียกแอปพลิเคชัน WSGI และดึงบรรทัดสถานะ HTTP ส่วนหัวการตอบกลับ และเนื้อหาการตอบกลับในรูปแบบอ็อบเจ็กต์ Python [ 10 ]รายละเอียดเกี่ยวกับวิธีการสร้างenvironพจนานุกรมถูกละเว้น
จากio นำเข้าBytesIOdef call_application ( app , environ ): status = None headers = None body = BytesIO ()def start_response ( rstatus , rheaders ): สถานะที่ไม่ใช่โลคอล, สถานะส่วนหัว, ส่วนหัว= rstatus , rheadersapp_iter = app ( environ , start_response ) try : for data in app_iter : assert ( status is not None and headers is not None ), "start_response() was not called" body . write ( data ) finally : if hasattr ( app_iter , "close" ): app_iter . close () return status , headers , body . getvalue ()environ = { ... } # "environ" dict status , headers , body = call_application ( app , environ )แอปพลิเคชันและเฟรมเวิร์กที่เข้ากันได้กับ WSGI
เฟรมเวิร์กเว็บจำนวนมากรองรับ WSGI:
- บียอร์น
- ปลาบลูเบรม
- โบโบ[ 11 ]
- ขวด
- เชอร์รี่พาย
- จังโก้[ 12 ]
- อีเวนต์เล็ต[ 13 ]
- ฟาสต์ดับเบิลยูเอสจี
- ฟลาสก์
- Falcon (เฟรมเวิร์กเว็บ) [ 14 ]
- Gevent-FastCGI [ 15 ]
- เว็บแอป 2 ของGoogle App Engine
- กุนิคอร์น
- เพรสแทนส์[ 16 ]
- mod_wsgiสำหรับใช้กับApache [ 17 ]
- เนติอุส
- ไพคนิค[ 18 ]
- คอมโพเนนต์การวาง (Paste component) WebOb เป็นส่วนขยายของ WSGI โดยเฉพาะ ซึ่งได้รับการนำไปใช้ในโครงการ Pylons
- เสาไฟฟ้า
- พีระมิด
- เรสไลท์[ 19 ]
- Socketify [ 20 ]
- พายุทอร์นาโด
- แทร็ก
- เทอร์โบเกียร์
- Uliweb [ 21 ]
- uWSGI
- พนักงานเสิร์ฟ[ 22 ]
- web.py [ 23 ]
- เว็บ2พาย
- เว็บเลเยอร์[ 24 ]
- Werkzeug [ 25 ]
- ราดิเคิล[ 26 ]
ปัจจุบันมี wrapper สำหรับFastCGI , CGI , SCGI , AJP (โดยใช้ flup), twisted.web , Apache (โดยใช้mod_wsgiหรือmod_python ), Nginx (โดยใช้ ngx_http_uwsgi_module), [ 27 ] Nginx Unit (โดยใช้โมดูลภาษา Python), [ 28 ]และMicrosoft IIS (โดยใช้ WFastCGI, [ 29 ] isapi-wsgi, [ 30 ] PyISAPIe, [ 31 ]หรือ เกตเวย์ ASP )
ดูเพิ่มเติม
- Asynchronous Server Gateway Interface (ASGI) – เป็นเทคโนโลยีที่พัฒนาต่อยอดจาก WSGI โดยเพิ่มการรองรับแอปพลิเคชันแบบอะซิงโครนัส
- Rack – อินเทอร์เฟซเว็บเซิร์ฟเวอร์Ruby
- PSGI – Perl Web Server Gateway Interface
- SCGI – Simple Common Gateway Interface
- JSGI – JavaScript web server gateway interface
ลิงก์ภายนอก
- PEP 333 – อินเทอร์เฟซเกตเวย์เว็บเซิร์ฟเวอร์ Python
- PEP 3333 – Python Web Server Gateway Interface v1.0.1
- เมตาเฟรมเวิร์ก WSGI
- วิกิที่ครอบคลุมทุกเรื่องเกี่ยวกับ WSGI
- บทช่วยสอน WSGI
- โมดูล wsgiref ในไลบรารีมาตรฐานของ Python
- เริ่มต้นใช้งาน WSGI
- NWSGI ถูกเก็บถาวรเมื่อวันที่ 27 ตุลาคม 2013 ที่Wayback Machine – การใช้งาน WSGI ตามข้อกำหนดของ Python ใน .NET สำหรับ IronPython และ IIS
- เซิร์ฟเวอร์ Gevent-FastCGI ที่พัฒนาขึ้นโดยใช้ไลบรารีเครือข่ายแบบ coroutine ของ gevent
สรุปเนื้อหา
ข้อมูลสำคัญจากบทความ
ข้อมูลสำคัญเกี่ยวกับ อินเทอร์เฟซเกตเวย์เว็บเซิร์ฟเวอร์
อิน เทอร์เฟซเกตเวย์เว็บเซิร์ฟเวอร์ ( WSGI ออกเสียงว่า whiskey [ 1 ] [ 2 ] หรือ WIZ -ghee [ 3 ] ) เป็น ข้อกำหนดการเรียกที่ เรียบง่าย สำหรับ เว็บเซิร์ฟเวอร์ ในการส่งต่อคำขอไปยัง...
พื้นหลัง
ในปี พ.ศ. 2546 เฟรมเวิร์กเว็บ Python มักจะเขียนขึ้นโดยใช้ CGI , FastCGI , mod_python หรือ API แบบกำหนดเองอื่นๆ ของเว็บเซิร์ฟเวอร์เฉพาะเท่านั้น [ 6 ] อ้างอิง จาก PEP 333:
มิดเดิลแวร์ WSGI
ส่วนประกอบมิดเดิลแวร์ WSGI คือฟังก์ชัน Python ที่สามารถเรียกใช้งานได้ ซึ่งตัวมันเองเป็นแอปพลิเคชัน WSGI แต่สามารถจัดการคำขอโดยการมอบหมายให้กับแอปพลิเคชัน WSGI อื่นๆ แอปพลิเคชันเหล่านี้สามารถเป็นส่วนประกอบมิดเดิลแวร์ WSGI ได้เช่นกัน [ 7 ]
ตัวอย่างการใช้งาน
แอปพลิเคชัน " Hello, World! " ที่เข้ากันได้กับ WSGI ซึ่งเขียนด้วย ภาษา Python :