Como frameworks web Python, WSGI e CGI se encaixam
Pergunta
Eu tenho um href="http://en.wikipedia.org/wiki/Bluehost" rel="noreferrer"> conta onde posso executar scripts Python como CGI. Eu acho que é o CGI mais simples, porque para executar tenho que definir o seguinte em .htaccess
:
Options +ExecCGI
AddType text/html py
AddHandler cgi-script .py
Agora, sempre que eu olhar para cima de programação web com Python, eu ouvi muito sobre WSGI e como a maioria dos frameworks usá-lo. Mas eu simplesmente não entendo como tudo se encaixa, especialmente quando o meu servidor web é dado (Apache rodando a máquina do host) e não algo que pode realmente jogar com (exceto a definição de comandos .htaccess
).
Como são WSGI , CGI, e os quadros todos conectados? O que eu preciso saber, instalar e fazer se eu quiser executar um framework web (digamos web.py ou < a href = "http://en.wikipedia.org/wiki/CherryPy" rel = "noreferrer"> CherryPy ) na minha configuração básica CGI? Como instalar o suporte WSGI?
Solução
Como WSGI, CGI, e os quadros são todos conectados?
Apache escuta na porta 80. Ela recebe uma solicitação HTTP. Ele analisa o pedido para encontrar uma maneira de responder. Apache tem um monte de opções para responder. Uma maneira de responder é usar CGI para executar um script. Outra maneira de responder é simplesmente servir um arquivo.
No caso do CGI, Apache prepara-se um ambiente e invoca o script através do protocolo CGI. Esta é uma situação normal Unix Fork / Exec - o subprocesso CGI herda um ambiente OS incluindo o soquete e stdout. O subprocesso CGI escreve uma resposta, que remonta a Apache; Apache envia essa resposta para o navegador.
CGI é primitivo e irritante. Principalmente porque ele bifurca um subprocesso para cada pedido, e sair subprocess obrigação ou fechar stdout e stderr para significar fim da resposta.
WSGI é uma interface que é baseado no padrão de design CGI. Não é necessariamente CGI - ele não tem de desembolsar um subprocesso para cada solicitação. Pode ser CGI, mas ele não tem que ser.
WSGI contribui para o padrão de design CGI em vários aspectos importantes. Ele analisa os cabeçalhos de solicitação HTTP para você e adiciona-los para o meio ambiente. Ela fornece qualquer entrada orientada para o POST como um objeto de arquivo-como no meio ambiente. Ele também fornece uma função que irá formular a resposta, poupando-o de um monte de formatação detalhes.
O que eu preciso saber / instalar / fazer se eu quiser executar um framework web (web.py dizer ou cherrypy) na minha configuração básica CGI?
Lembre-se que bifurcação um subprocesso é caro. Há duas maneiras de contornar isso.
-
Incorporado
mod_wsgi
oumod_python
embute o Python dentro do Apache; nenhum processo é bifurcada. Apache executa o aplicativo Django diretamente. -
daemon mod_wsgi
oumod_fastcgi
permite Apache para interagir com um daemon separado (ou "processo de longa duração"), utilizando o protocolo WSGI. Você começa o seu processo Django longa, então você configurar mod_fastcgi do Apache para se comunicar com este processo.
Note que mod_wsgi
pode trabalhar em qualquer modo:. Incorporado ou daemon
Quando você ler sobre mod_fastcgi, você verá que o Django usa FLUP para criar uma interface WSGI compatível com base nas informações fornecidas por mod_fastcgi. O gasoduto funciona assim.
Apache -> mod_fastcgi -> FLUP (via FastCGI protocol) -> Django (via WSGI protocol)
Django tem vários "django.core.handlers" para as várias interfaces.
Para mod_fastcgi, Django fornece uma manage.py runfcgi
que integra FLUP eo manipulador.
Para mod_wsgi, há um manipulador de núcleo para isso.
Como instalar o suporte WSGI?
Siga estas instruções.
https://code.google.com/archive/p/ modwsgi / wikis / IntegrationWithDjango.wiki
Para o fundo ver este
http://docs.djangoproject.com/en / dev / howto / implantação / # howto-implantação índice
Outras dicas
resposta de Florian responde a parte da sua pergunta sobre "o que é WSGI", especialmente se você ler o PEP .
Como para as perguntas que você representar para o final:
WSGI, CGI, FastCGI etc, são todos os protocolos para um servidor web para código executar , e entregar o conteúdo dinâmico que é produzido. Compare isto com a web estática servir, onde um arquivo HTML simples é basicamente entregue como é para o cliente.
CGI, FastCGI e SCGI são agnósticos linguagem. Você pode escrever scripts CGI em Perl, Python, C, bash, o que for. define CGI que executável será chamado, baseado na URL, e como ele será chamado: os argumentos e meio ambiente. Ele também define como o valor de retorno deve ser passado de volta para o servidor web uma vez que seu executável está terminado. As variações são basicamente otimizações para ser capaz de lidar com mais solicitações, reduzir a latência e assim por diante; o conceito básico é o mesmo.
.WSGI é Python única Ao invés de um protocolo agnóstico linguagem, uma assinatura função padrão é definido:
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']
Isso é uma aplicação WSGI completo (se limitado). Um servidor Web com suporte WSGI (como o Apache com mod_wsgi) pode invocar esta função sempre que um pedido chega.
A razão isto é tão grande é que podemos evitar o passo confuso de conversão de um HTTP GET / POST para CGI para Python, e de volta no caminho para fora. É uma ligação muito mais direta, limpa e eficiente.
Ele também torna muito mais fácil ter estruturas de longa execução correndo atrás de servidores web, se tudo o que precisa ser feito para um pedido é uma chamada de função. Com CGI simples, você teria que começar todo o seu quadro se para cada pedido individual.
Para ter suporte WSGI, você precisa ter instalado um módulo WSGI (como mod_wsgi ), ou usar um servidor web com WSGI cozido em (como CherryPy ). Se nenhum desses são possíveis, você poderia usar a ponte CGI-WSGI dada no PEP.
Você pode prazo WSGI sobre CGI como Pep333 demonstra como um exemplo. No entanto cada vez que há um pedido de um novo interpretador Python é iniciado e todo o contexto (conexões de banco de dados, etc.) precisa ser construído, que todos levam tempo.
A melhor se você deseja executar WSGI seria se o seu host iria instalar mod_wsgi fez uma configuração apropriada para o controle submeter a uma aplicação de seu.
Flup é outra maneira de correr com WSGI para qualquer servidor web que pode falar FCGI , SCGI ou AJP. Da minha experiência única FCGI realmente funciona, e ele pode ser usado no Apache ou via mod_fastcgi ou se você pode executar um daemon Python separado com mod_proxy_fcgi .
WSGI é um protocolo muito parecido com CGI, que define um conjunto de regras como servidor web e Python código pode interagir, é definido como Pep333 . Ele torna possível que muitos servidores web diferentes podem usar muitos frameworks e aplicações diferentes usando o mesmo protocolo de aplicação. Isto é muito benéfico e torna tão útil.
Se você não são claras sobre todos os termos deste espaço, e vamos enfrentá-lo, é uma confundindo um acrónimo-laden, há também um leitor bom fundo na forma de um HOWTO oficial python que discute CGI vs. FastCGI vs. WSGI e assim por diante: http://docs.python.org/howto/webservers.html
É uma camada de abstração simples para Python, semelhante ao que a especificação Servlet é para Java. Considerando CGI é realmente baixo nível e apenas despeja o material no ambiente de processo e padrão in / out, o acima duas especificações modelar o pedido HTTP e resposta como construções na linguagem. Minha impressão, porém, é que em pessoas Python não tem muito liquidada em implementações de-facto para que você tenha uma mistura de implementações de referência, e outras bibliotecas do tipo utilitário que fornecem outras coisas, juntamente com o apoio WSGI (por exemplo Cole). É claro que eu poderia estar errado, eu sou um recém-chegado ao Python. A comunidade "scripting web" está vindo para o problema de uma direção diferente (hospedagem compartilhada, o legado CGI, as preocupações de separação de privilégio) do que pessoas Java teve o luxo de começar com (a execução de um único recipiente empresa em um ambiente dedicado contra estaticamente compilado e implantado código).