Hoje contamos com alguns servidores HTTP (web) tais como Apache, lighttpd, Nginx, TUX, Cherokee e outros. O desenvolvimento deste artigo é para explicar melhor como trabalhar com Python e desenvolver coisas novas para as necessidades do dia a dia.
Vou explicar qual foi a necessidade do meu cliente para que eu escrevesse este software:
O Cliente tinha um sistema rodando com Ruby On Rails e o desenvolvedor como não sabia configura o Ruby para processar juntamente com o servidor web (Apache); ele rodou o servidor web do próprio Ruby On Rails com a porta 4000.
Como teria que mexer no sistema e não sou programador Ruby, fiz uma contra-proposta para desenvolver o sistema novamente (porque tinha muitos erros) em Python (pois é a linguagem que eu sei programar). O cliente aceitou e dei start no desenvolvimento.
Ao terminar o software, queria que ficasse transparente para o usuário final (para ele acessar da mesma forma que acessava); testei alguns servidores web como Nginx e lighttpd, só que ele estava comendo recursos desnecessário no servidor, lembrando que eu só queria colocar um HTML com uma meta tag para redirecionar para o sistema novo. Bom, resolvi desenvolver uma solução própria em Python, e achei a biblioteca BaseHTTPServer.
A estrutura que montei é a seguinte:
O daemon que vamos usar é o httpd.py, vamos para a parte de código.
Vamos usar as seguintes bibliotecas:
Vamos escrever uma classe para tratar o POST e GET (Não usei o POST na minha necessidade, mas para quem quer fazer um servidor HTTP simples pode precisar):
Os nomes das def do_GET e do_POST são padrões do BaseHTTPRequestHandler. O do_GET usamos para renderização de qualquer arquivo. Por exemplo, temos uma index.html em nossa pasta htdocs, ele vai trabalhar pegando o arquivo index.html (/home/avelino/python/httpd/htdocs/index.html) e renderizando o html dele.
Vou criar uma função para chamar as declarações da classe:
A var NameVirtualHost é onde vamos passar IP e PORTA para o servidor HTTP, exemplo.
Liberar só para acesso local: localhost:8000
Liberar para qualquer IP que estiver configurado na maquina: *:8000
Na biblioteca BaseHTTPServer temos uma função onde o mesmo server, para rodar o servidor, recebe dois parâmetros: o primeiro é IP/PORTA, e o segundo é a classe onde estão os métodos (GET, POST etc) que, no nosso caso, é a classe html.
Agora vamos chamar a def que fizemos:
- DocumentRoot = Pega a pasta local que estamos e concatena com "/htdocs/"
- PORT = Porta padrão do servidor
- HOST = Host padrão do servidor
Temos uma TRY que vamos tratar o que vem por parâmetro (argv), caso ele tenha valores errados chamará o HOST/PORT declarado do software.
Rodando o servidor:
Agora, para matar o processo, é como qualquer outro:
Se olharmos o LOG acima, ele mostra tudo que foi processado com LOG de Apache ou qualquer outro servidor HTTP.
Fora de tópico Mostrar Código Esconder Código Mostrar EmoticonEsconder Emoticon