Capítulo 26
Primeiros passos no servidor
3 min de leitura 579 palavras 1 gravura
Trabalhe numa cópia da pasta inicio/ desta etapa. Ela já abre ou executa com as instruções do README. Leia o código, mude uma coisa e anote sua previsão antes de recarregar. Compare com a referência na pasta da etapa. Se nada mudar, confira a extensão do arquivo, o arquivo salvo e o caminho aberto. Blocos adicionais do capítulo são experiências separadas; a pasta de referência contém o programa completo desta etapa.
A Biblioteca da Ribeira, acervo comunitário fictício no bairro da Ribeira, Recife, até agora era arquivo estático. Um processo na sua máquina passa a escutar pedidos e responder. PHP não entra neste volume.
O exemplo está em exemplos/26-primeiros-passos-no-servidor/. O ciclo: ler, copiar, mudar uma coisa, prever, recarregar, conferir.
O que você vai aprender
- Separar cliente e servidor.
- Situar frameworks no mapa, sem instalar um ainda.
- Aplicar três cuidados de segurança básica.
- Rodar
servidor.pyem127.0.0.1:8768.
Cliente e servidor
O cliente é o navegador. Ele pede. O servidor é o programa que escuta e devolve HTML, CSS, JSON ou erro.

Pedido típico: GET / ou GET /livros. Resposta típica: código 200 e um arquivo. Se o caminho não existe, 404. O navegador então pinta o HTML. O servidor já terminou aquele pedido.
Frameworks, o mapa
Um framework de servidor organiza rotas, modelos e páginas. Neste volume virão Django (Python) e Express (Node). O capítulo 27 abre Django. Express espera a 30.
Página estática é arquivo pronto, como este index.html. Página gerada nasce na hora, a partir de modelo e dados. servidor.py ainda só entrega o arquivo.
Você não escolhe um framework agora. Primeiro vê um processo mínimo em Python, só nesta máquina. PHP não entra em nenhuma destas pastas.
Segurança básica
Não confie no que o cliente envia. Qualquer um pode editar HTML e JS na própria janela. Validação no navegador ajuda a pessoa. A decisão de verdade, quando houver servidor de dados, fica no servidor.
Não publique exercício com dado real. Não escute em 0.0.0.0. Estudo: 127.0.0.1. Senha, sessão e HTTPS entram nos capítulos de Django e Express. Aqui o servidor só entrega arquivo estático.
python servidor.py
from http.server import ThreadingHTTPServer, SimpleHTTPRequestHandler
class Handler(SimpleHTTPRequestHandler):
def log_message(self, format, *args):
print("pedido", args[0])
if __name__ == "__main__":
server = ThreadingHTTPServer(("127.0.0.1", 8768), Handler)
print("http://127.0.0.1:8768")
server.serve_forever()
Na pasta do exemplo:
python servidor.py
Abra http://127.0.0.1:8768. O terminal imprime o pedido. Encerre com Ctrl+C.
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Servidor local</title>
</head>
<body>
<h1>Este arquivo é estático</h1>
<p>Rode <code>python servidor.py</code> nesta pasta. O processo escuta só 127.0.0.1:8768.</p>
</body>
</html>
Mude o <h1> para “Pátio da Ribeira”. Salve. Preveja o novo título. Recarregue http://127.0.0.1:8768. Confira. O processo continua o mesmo; o arquivo no disco é que mudou.
Erro comum: abrir index.html pelo disco e achar que servidor.py está rodando. Sem o processo, a porta 8768 não responde. Outro erro: copiar um tutorial com 0.0.0.0.
Disco guarda servidor.py e index.html. A janela em 127.0.0.1:8768 é o teste. Publicação pública não é este passo. PHP não faz parte deste percurso.
Atividades
- Quem é o cliente e quem é o servidor neste exemplo?
- Por que o endereço é
127.0.0.1e não0.0.0.0? - Validar um formulário só no navegador basta quando o servidor guardar dado?
Respostas comentadas
- Cliente: o navegador que pede
http://127.0.0.1:8768. Servidor: o processopython servidor.pyque escuta a porta 8768 e devolveindex.html. 127.0.0.1é só esta máquina.0.0.0.0abre a escuta para outros endereços. O volume não usa isso.- Não. O cliente pode ser alterado. Quando houver dado de verdade, o servidor também valida. Neste capítulo ainda não há banco.
O arquivo completo
Referência do exemplo 26-primeiros-passos-no-servidor, reproduzida aqui para que você possa conferir sem sair da página.
index.html
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="utf-8"/>
<meta content="width=device-width, initial-scale=1" name="viewport"/>
<title>Servidor local</title>
<style>
/* Apoio de leitura, teclado e tela estreita. */
img{max-width:100%;height:auto} html {overflow-wrap:anywhere} main {min-width:0} input,textarea,select,canvas {max-width:100%;box-sizing:border-box} fieldset {min-width:0}
pre {max-width:100%;overflow:auto} :focus-visible {outline:3px solid #0f3d3e;outline-offset:3px}
.skip {position:absolute;top:-5rem;left:1rem;background:#0f3d3e;color:white;padding:.5rem;z-index:9}.skip:focus {top:.5rem}
table {max-width:100%} td,th {overflow-wrap:anywhere}
@media(prefers-reduced-motion:reduce){*,*::before,*::after{animation:none!important;transition:none!important;scroll-behavior:auto!important}}
</style></head>
<body><a class="skip" href="#conteudo">Pular para o conteúdo</a><main id="conteudo" tabindex="-1">
<h1>Este arquivo é estático</h1>
<p>Rode <code>python servidor.py</code> nesta pasta. O processo escuta só 127.0.0.1:8768.</p>
</main></body>
</html>
servidor.py
from http.server import ThreadingHTTPServer, SimpleHTTPRequestHandler
class Handler(SimpleHTTPRequestHandler):
def log_message(self, format, *args):
print("pedido", args[0])
if __name__ == "__main__":
server = ThreadingHTTPServer(("127.0.0.1", 8768), Handler)
print("http://127.0.0.1:8768")
server.serve_forever()