Python web çerçeveleri, WSGI ve CGI birbirine nasıl uyar?


150

Python komut dosyalarını CGI olarak çalıştırabileceğim bir Bluehost hesabım var . Sanırım en basit CGI, çünkü çalıştırmak için aşağıdakileri tanımlamak zorundayım .htaccess:

Options +ExecCGI
AddType text/html py
AddHandler cgi-script .py

Şimdi, Python ile web programlamaya baktığımda, WSGI ve çoğu çerçevenin bunu nasıl kullandığı hakkında çok şey duyuyorum. Ancak, özellikle web sunucum verildiğinde (bir ana bilgisayarın makinesinde çalışan Apache) gerçekten birlikte oynayabileceğim bir şey değil ( .htaccesskomutları tanımlamak dışında ) hepsinin nasıl uyduğunu anlamıyorum .

WSGI , CGI ve çerçevelerin hepsi nasıl birbirine bağlıdır? Temel CGI yapılandırmamda bir web çerçevesi ( web.py veya CherryPy diyelim) çalıştırmak istersem ne yapmam, yüklemem ve yapmam gerekir ? WSGI desteği nasıl kurulur?

Yanıtlar:


242

WSGI, CGI ve çerçevelerin hepsi nasıl birbirine bağlıdır?

Apache 80 numaralı bağlantı noktasını dinler. Bir HTTP isteği alır. Yanıt vermenin bir yolunu bulma isteğini ayrıştırır. Apache'nin yanıt vermek için çok fazla seçeneği vardır. Yanıt vermenin bir yolu, bir komut dosyası çalıştırmak için CGI kullanmaktır. Yanıt vermenin başka bir yolu da bir dosyaya hizmet etmektir.

CGI söz konusu olduğunda Apache bir ortam hazırlar ve komut dosyasını CGI protokolü aracılığıyla çağırır. Bu standart bir Unix Fork / Exec durumudur - CGI alt işlemi soket ve stdout dahil olmak üzere bir işletim sistemi ortamını devralır. CGI alt süreci, Apache'ye geri dönen bir yanıt yazar; Apache bu yanıtı tarayıcıya gönderir.

CGI ilkel ve sinir bozucudur. Çoğunlukla her istek için bir alt süreç çatalladığı ve alt işlemin yanıtın sonunu belirtmek için stdout ve stderr'den çıkması veya kapatması gerekir.

WSGI, CGI tasarım modeline dayanan bir arabirimdir. Mutlaka CGI değildir - her istek için bir alt süreç çatallamak zorunda değildir. CGI olabilir, ama olmak zorunda değildir.

WSGI, CGI tasarım modeline birkaç önemli şekilde ekler. HTTP İstek Üstbilgilerini sizin için ayrıştırır ve bunları ortama ekler. Ortamda dosya benzeri bir nesne olarak POST yönelimli herhangi bir girdi sağlar. Ayrıca, size birçok biçimlendirme ayrıntısından tasarruf ederek yanıtı formüle edecek bir işlev sunar.

Temel CGI yapılandırmamda bir web çerçevesi (web.py veya cherrypy diyelim) çalıştırmak istersem ne bilmem / yüklemem / yapmam gerekir?

Bir alt işlemin çatallanmasının pahalı olduğunu hatırlayın. Bu sorunu çözmek için iki yol vardır.

  1. Python'u Apache içine gömülümod_wsgi veya mod_pythongömme; hiçbir işlem çatallanmaz. Apache, Django uygulamasını doğrudan çalıştırır.

  2. Daemon mod_wsgi veya mod_fastcgiApache'nin WSGI protokolünü kullanarak ayrı bir daemon (veya "uzun süren işlem") ile etkileşime girmesine izin verir. Uzun süredir çalışan Django işleminize başlarsınız, ardından Apache'nin mod_fastcgi işlevini bu işlemle iletişim kuracak şekilde yapılandırırsınız.

mod_wsgiHer iki modda da çalışabileceğini unutmayın : katıştırılmış veya arka plan programı.

Eğer mod_fastcgi kadar okuduğunuzda, Django kullanan olduğunu göreceksiniz Flup mod_fastcgi tarafından sağlanan bilgilerden WSGI uyumlu arayüzler oluşturun. Boru hattı böyle çalışır.

Apache -> mod_fastcgi -> FLUP (via FastCGI protocol) -> Django (via WSGI protocol)

Django'nun çeşitli arayüzler için birkaç "django.core.handlers" vardır.

Mod_fastcgi için Django, manage.py runfcgiFLUP ve işleyiciyi entegre eden bir özellik sunar.

Mod_wsgi için bunun temel bir işleyicisi vardır.

WSGI desteği nasıl kurulur?

Bu talimatları izleyin.

https://code.google.com/archive/p/modwsgi/wikis/IntegrationWithDjango.wiki

Arka plan için buna bakın

http://docs.djangoproject.com/en/dev/howto/deployment/#howto-deployment-index


4
Paylaşılan barındırmada olduğum için mod_wsgi'yi yükleyemiyorum. Sahip olduğum tek şey fcgi desteği. WSGI uygulamalarını yine de nasıl çalıştırabilirim?
Eli Bendersky

3
+1 Bu mükemmel bir cevap ve aklımda olan tüm soruları (ama hepsi değil) cevaplar. Bu cevap hala tam değil. CGI ve WSGI hakkında iyi açıklama yaptınız ancak FASTCGI ve WSGI arasındaki ilişki ve farklar nelerdir? Hangisi daha iyi? Nasıl çalışırlar? Mod_python resme nasıl geldi?
pençeleri

14
S.Lott, insanların hangisinin "daha iyi" olduğunu sorduğunda şikayet etmek yerine, neden "mod_wsgi'nin X olarak daha iyi olduğunu, fastcgi'nin Y için daha iyi olduğunu" belirtmemek yerine OP'nin daha spesifik soruları varsa sorarlar.
Gregg Lind

7
@Greg Lind: Neden sadece "mod_wsgi X kadar iyi, fastcgi Y için daha iyi" şeklinde değil? Çünkü bunu yapmak çok kolay değil. X ve Y setlerinin elemanları olan onlarca işlevsel olmayan kalite faktörü vardır. Hepsini saymak zor. İnsanların ilgili kalite faktörleri hakkında özel sorular sorması çok daha iyidir.
S.Lott

4
Sadece notlar için: 1.7 sürümü ve FastCGI desteği Django 1.9'da kaldırıldığından runfcgi seçeneği kullanımdan kaldırılmıştır.
OBu

58

Bence Florian cevabı okumak, özellikle "WSGI nedir" ile ilgili sorunuza bir kısmını cevaplar PEP .

Sona doğru yönelttiğiniz sorulara gelince:

WSGI, CGI, FastCGI vb. Bir web sunucusunun kod çalıştırması ve üretilen dinamik içeriği sunması için kullanılan protokollerdir . Bunu, temel bir HTML dosyasının istemciye olduğu gibi iletildiği statik web sunumu ile karşılaştırın.

CGI, FastCGI ve SCGI dil bilincine sahip değildir. Perl, Python, C, bash, ne olursa olsun CGI komut dosyaları yazabilirsiniz. CGI , URL'ye dayalı olarak hangi yürütülebilir dosyanın çağrılacağını ve nasıl çağrılacağını tanımlar : argümanlar ve ortam. Ayrıca, yürütülebilir dosyanız bittikten sonra dönüş değerinin web sunucusuna nasıl aktarılması gerektiğini de tanımlar. Varyasyonlar temelde daha fazla istekle başa çıkabilmek, gecikmeyi azaltabilmek vb. temel kavram aynı.

WSGI yalnızca Python'dur. Bir dil agnostik protokolünden ziyade standart bir işlev imzası tanımlanır:

def simple_app(environ, start_response):
    """Simplest possible application object"""
    status = '200 OK'
    response_headers = [('Content-type','text/plain')]
    start_response(status, response_headers)
    return ['Hello world!\n']

Bu tam (sınırlıysa) bir WSGI uygulamasıdır. WSGI desteğine sahip bir web sunucusu (mod_wsgi ile Apache gibi), bir istek geldiğinde bu işlevi çağırabilir.

Bunun bu kadar büyük olmasının nedeni, bir HTTP GET / POST'tan CGI'ya Python'a dönüştürmenin dağınık adımından kaçınabilmemiz ve çıkışta tekrar geri dönmemizdir. Çok daha doğrudan, temiz ve verimli bir bağlantı.

Ayrıca, bir istek için yapılması gereken tek şey bir işlev çağrısı ise, web sunucularının arkasında uzun süre çalışan çerçevelerin çalışmasını kolaylaştırır. Düz CGI ile, her bir istek için tüm çerçevenizi başlatmanız gerekir .

WSGI desteğine sahip olmak için, bir WSGI modülü ( mod_wsgi gibi ) kurmanız veya WSGI'nın ( CherryPy gibi ) pişirildiği bir web sunucusu kullanmanız gerekir . Bunların hiçbiri mümkün değilse, sen olabilir PEP verilen CGI WSGI köprüsünü kullanın.


3
WSGI dilini agnostik yapmak kimin aptalca fikriydi? Ne demek istiyorsun? Python'un tamamını bir Apache modülü olarak da gönderebilir.
Salman von Abbas

2
@SalmanPK Bence bu sadece bir takas. Elbette, seçili dilde bir işlev uygulanarak kullanılabilecek bir dil agnostik protokolü yapmak (imkansız değilse de) kolay değildir.
phunehehe

21

Sen edebilirsiniz Pep333 gösterdiği gibi CGI üzerinde WSGI çalıştırmak bir örnek olarak. Ancak, her istek olduğunda yeni bir Python yorumlayıcısı başlatılır ve tüm bağlamın (veritabanı bağlantıları, vb.) Oluşturulması gerekir.

WSGI'yi çalıştırmak istiyorsanız en iyisi, ana makinenizin mod_wsgi'yi yüklemesi ve bir uygulamanızın kontrolünü ertelemek için uygun bir yapılandırma yapmasıdır.

Flup , FCGI , SCGI veya AJP konuşabilen herhangi bir web sunucusu için WSGI ile çalışmanın başka bir yoludur . Deneyimlerime göre sadece FCGI gerçekten işe yarıyor ve mod_fastcgi aracılığıyla Apache'de veya mod_proxy_fcgi ile ayrı bir Python arka plan programı çalıştırabiliyorsanız kullanılabilir .

WSGI , web sunucusu ve Python kodunun nasıl etkileşime girebileceğini tanımlayan bir dizi kuralı tanımlayan CGI'ya çok benzer bir protokoldür ve Pep333 olarak tanımlanır . Birçok farklı web sunucusunun aynı uygulama protokolünü kullanarak birçok farklı çerçeve ve uygulama kullanabilmesini mümkün kılar. Bu çok faydalı ve çok kullanışlı.


3
WSGI'yi CGI üzerinden çalıştırmak "flup" ne içindir? Flup şemaya nasıl bağlanır?
Eli Bendersky


4

Plethon için, Servlet spesifikasyonunun Java için ne olduğuna benzeyen basit bir soyutlama katmanıdır. CGI gerçekten düşük seviyededir ve sadece süreç ortamına ve standart giriş / çıkışlara dökülürken, yukarıdaki iki özellik http isteğini ve yanıtını dilde yapı olarak modellemektedir. Benim izlenimim Python millet de facto uygulamalara oldukça yerleşmiş değil bu yüzden referans uygulamaları ve WSGI desteği ile birlikte başka şeyler sağlayan diğer yarar türü kütüphaneler (örneğin Yapıştır) bir karışımı var. Tabii yanlış olabilirim, Python'a yeni gelen biriyim. "Web komut dosyası oluşturma" topluluğu soruna farklı bir yönden geliyor (paylaşılan barındırma, CGI mirası,

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.