واسط دروازه کارساز وب

«مطالب این مقاله از https://en.wikipedia.org/wiki/Web_Server_Gateway_Interface در تاریخ ‎۵ تیر ۱۴۰۰ ترجمه شده‌است.»

رابط دروازه وب سرور 
رابط دروازه وب سرور (WSGI ، ویسکی تلفظ می شود یا wiz - ghee ) یک کنوانسیون تماس ساده برای سرورهای وب برای ارسال درخواست ها به برنامه های وب یا فریم وورک های نوشته شده در زبان برنامه نویسی پایتون است. نسخه فعلی WSGI ، نسخه 1.0.1 ، در Python Enhancement Proposal (PEP) 3333 مشخص شده است. 

WSGI ابتدا در PEP - 333 در سال 2003 منتشر شد. [5] PEP - 3333 ، که در سال 2010 منتشر شد ، مشخصات را برای  Python 3 به روز می کند.

پس زمینه 
در سال 2003 ، چارچوب های وب پایتون معمولاً فقط در برابر CGI ، FastCGI ، mod _ python یا برخی دیگر از API های سفارشی وب سرور خاص نوشته می شدند. [6] به نقل از PEP 333:

در حال حاضر پایتون از طیف گسترده ای از چارچوب های برنامه وب ، مانند Zope ، Quixote ، Webware ، SkunkWeb ، PSO و Twisted Web - دارای چند مورد است. این تنوع گسترده در انتخاب می تواند برای کاربران جدید پایتون مشکل ساز شود ، زیرا به طور کلی ، انتخاب فریموورک وب باعث محدود شدن انتخاب وب سرورهای قابل استفاده می شود و بالعکس ... در مقابل ، اگرچه جاوا به همان تعداد چارچوب برنامه های وب دارد ولی API "servlet" جاوا این امکان را برای برنامه های نوشته شده با هر فریموورک وب جاوا فراهم می کند تا در هر وب سروری که از servlet API پشتیبانی می کند ، اجرا شوند.

بنابراین WSGI به عنوان یک پیاده سازی ایجاد شد -تا رابط بین وب سرورها و برنامه های وب باا چارچوب ها برای ایجاد زمینه های مشترک برای توسعه برنامه های وب پرتابل.

مرور مشخصات 
WSGI دو سمت دارد:

سمت سرور / دروازه. این برنامه اغلب در حال اجرای کامل نرم افزار وب سرور مانند Apache یا Nginx است یا یک سرور کاربردی سبک است که می تواند با یک سرور وب مانند flup ارتباط برقرار کند.

سمت برنامه / چارچوب. این سمت ازحنس  پایتون است که می تواند توسط برنامه یا فریموورک پایتون تهیه شود.

بین سرور و برنامه ، ممکن است یک یا چند اجزای میان افزار ی وجود داشته باشد که هر دو طرف API را اجرا می کنند ، معمولاً در زبان پایتون.

WSGI مشخص نمی کند که چگونه مفسر Python باید راه اندازی شود و همچنین نحوه بارگیری یا پیکربندی شی application برنامه مشخص نیست و چارچوب ها و سرورهای مختلف به روش های مختلف به این هدف دست می یابند.

میان افزار WSGI 
یک جز میان افزار WSGI یک فراخوان پایتون است که خود یک برنامه WSGI است ، اما ممکن است با تفویض اختیار به سایر برنامه های WSGI درخواست ها را کنترل کند. این برنامه ها می توانند خود مؤلفه های میان افزار WSGI باشند.

یک جز میان افزار می تواند چنین عملکردهایی را انجام دهد: 

 مسیریابی درخواست به اشیا مختلف برنامه بر اساس URL هدف ، پس از تغییر متغیرهای محیط متناسب با آن.

 اجازه دادن به فعالیت در کنار هم چندین برنامه یا فریموورک در یک فرآیند

 انجام تعادل بار و پردازش از راه دور  با انتقال درخواست ها و پاسخ ها از طریق شبکه

 انجام پس پردازش روی محتوا ، مانند استفاده از استایل شیت های XSLT

مثال

اپلیکیشن نمونه 
برنامه "Hello, World"  سازگار با WSGI  که در پایتون نوشته شده است:def application(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/plain')])
    yield b'Hello, World!\n'جایی که :

 خط 1 یک تابع [8] با نام application را تعریف می کند ، که دو پارامتر environ و start_response را می گیرد. environ یک دیکشنری است که شامل متغیرهای محیط CGI و سایر پارامترهای درخواست و متادیتا  تحت کلیدهای خوش تعریف است. start_response با استفاده از دو پارامتر موقعیتی ، status و response_headers قابل احضار است.

 خط 2 start_response را صدا می کند ، "200 OK" را به عنوان وضعیت HTTP و یک سرآیند "Content-Type" را مشخص می کند.

 خط 3 تابع را به یک ژنراتور تبدیل می کند. بدنه پاسخ به عنوان یک رشته بایت قابل تکرار برگردانده می شود.

نمونه ای از صدا زدن یک اپلیکیشن 
یک مثال کامل از سرور شبکه WSGI خارج از حوصله این مقاله است. در زیر طرحی از چگونگی فراخوانی برنامه WSGI و بازیابی خط وضعیت HTTP ، هدرهای پاسخ و بدنه پاسخ آن به عنوان اشیا  پایتون آورده شده است.  جزئیات مربوط به نحوه ساخت دیکشنری environ حذف شده است.from io import BytesIO

def call_application(app, environ):
    status = None
    headers = None
    body = BytesIO()
    
    def start_response(rstatus, rheaders):
        nonlocal status, headers
        status, headers = rstatus, rheaders
        
    app_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 پشتیبانی می کنند:

 bjoern
 BlueBream
 bobo
 Bottle
 CherryPy
 Django
 Eventlet
 Flask
 Falcon (web framework) 
 Gevent-FastCGI
 Google App Engine's webapp2
 Gunicorn
 prestans
 mod_wsgi for use with Apache
 netius
 pycnic
 Paste component WebOb is specifically a WSGI extension. It was adopted by the Pylons project.
 Pylons
 Pyramid
 restlite
 Tornado
 Trac
 TurboGears
 Uliweb
 uWSGI
 Waitress
 web.py
 web2py
 weblayer
 Werkzeug
 Radicale

پوشه های فعلی برای FastCGI ، CGI ، SCGI ، AJP (با استفاده از flup) ، twisted.web ، Apache (با استفاده از mod _ wsgi یا mod _ python) ، Nginx (با استفاده از ngx _ http _ uwsgi _ module) و Microsoft  IIS (با استفاده از WFastCGI ، [27] isapi - wsgi ، [28] PyISAPIe ، [29] یا درگاه ASP) در دسترس هستند.

جستارهای وابسته 
 واسط دروازه مشترک
 واسط دروازه مشترک سریع
 میان‌افزار

پانویس

منابع 
 

پایتون (زبان برنامه‌نویسی)