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:
Python1 2 3 4 5 6 7 8 9 10 11 12 13from 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:
Python1 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 42from 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:
Python1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24from 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.



