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

**رابط دروازه وب سرور**   (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  که در پایتون نوشته شده است:
```python
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 حذف شده است.
```python
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) در دسترس هستند.

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

## پانویس

# 

## منابع
* 

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