Budowa prostego serwera HTTP w Pythonie

Kacper Sieradziński
Kacper Sieradziński
28 maja 2025Edukacja2 min czytania

Tworzenie prostego serwera HTTP w Pythonie od podstaw to doskonały sposób na zrozumienie fundamentów aplikacji webowych. Zamiast od razu korzystać z frameworków takich jak Flask czy Django, możesz zbudować podstawowy serwer, który obsługuje zapytania HTTP, parsuje ścieżki URL i generuje odpowiedzi. To ćwiczenie pozwala zobaczyć, co faktycznie dzieje się "pod spodem" w aplikacjach webowych i lepiej wykorzystać możliwości frameworków, które abstrakcjonują te mechanizmy.

Obraz główny Budowa prostego serwera HTTP w Pythonie

Python oferuje wbudowany moduł http.server, który pozwala na szybkie stworzenie działającego serwera HTTP, jednak dla większej kontroli warto użyć biblioteki socketserver lub bezpośrednio socket. Poniżej znajdziesz praktyczne przykłady, które pokazują jak krok po kroku zbudować serwer obsługujący podstawowe żądania HTTP.

Prosty serwer HTTP z http.server

Najprostszy sposób na uruchomienie serwera HTTP w Pythonie to użycie modułu http.server, który dostarcza podstawowy serwer HTTP oraz obsługę plików statycznych:

Python
1 2 3 4 5 6 7 8 9 10 11 12 13 from http.server import HTTPServer, BaseHTTPRequestHandler class SimpleHandler(BaseHTTPRequestHandler): def do_GET(self): self.send_response(200) self.send_header('Content-type', 'text/html; charset=utf-8') self.end_headers() self.wfile.write(b'<h1>Hello, World!</h1>') if __name__ == '__main__': server = HTTPServer(('localhost', 8000), SimpleHandler) print('Serwer uruchomiony na http://localhost:8000') server.serve_forever()

Routing i obsługa różnych ścieżek

Prawdziwy serwer webowy musi obsługiwać różne ścieżki URL i zwracać odpowiednie odpowiedzi. Oto przykład implementacji prostego routingu:

Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 from http.server import HTTPServer, BaseHTTPRequestHandler import json class RouterHandler(BaseHTTPRequestHandler): routes = { '/': 'home', '/api': 'api', '/about': 'about' } def do_GET(self): path = self.path.split('?')[0] # Usuń query string if path in self.routes: handler = getattr(self, f'handle_{self.routes[path]}') handler() else: self.send_error(404, "Not Found") def handle_home(self): self.send_response(200) self.send_header('Content-type', 'text/html; charset=utf-8') self.end_headers() self.wfile.write(b'<h1>Strona główna</h1>') def handle_api(self): self.send_response(200) self.send_header('Content-type', 'application/json') self.end_headers() data = {'message': 'Hello from API', 'status': 'ok'} self.wfile.write(json.dumps(data).encode()) def handle_about(self): self.send_response(200) self.send_header('Content-type', 'text/html; charset=utf-8') self.end_headers() self.wfile.write(b'<h1>O nas</h1><p>Prosty serwer HTTP w Pythonie</p>') if __name__ == '__main__': server = HTTPServer(('localhost', 8000), RouterHandler) print('Serwer uruchomiony na http://localhost:8000') server.serve_forever()

Obsługa zapytań POST

Obsługa zapytań POST wymaga odczytania danych z ciała żądania:

Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 from http.server import HTTPServer, BaseHTTPRequestHandler import json class PostHandler(BaseHTTPRequestHandler): def do_POST(self): content_length = int(self.headers['Content-Length']) post_data = self.rfile.read(content_length) try: data = json.loads(post_data.decode('utf-8')) # Przetwórz dane response = {'received': data, 'status': 'success'} self.send_response(200) self.send_header('Content-type', 'application/json') self.end_headers() self.wfile.write(json.dumps(response).encode()) except json.JSONDecodeError: self.send_error(400, "Invalid JSON") if __name__ == '__main__': server = HTTPServer(('localhost', 8000), PostHandler) print('Serwer uruchomiony na http://localhost:8000') server.serve_forever()

Podsumowanie

Budowa prostego serwera HTTP od podstaw to doskonałe ćwiczenie pozwalające zrozumieć:

  • Cykl żądania-odpowiedzi w aplikacjach webowych
  • Routing i obsługę różnych ścieżek URL
  • Obsługę metod HTTP (GET, POST)
  • Formatowanie odpowiedzi w HTML i JSON

Te umiejętności są podstawą do pracy z frameworkami webowymi w Pythonie.