python -m http.server în Python

HTTP și rețea Python 3.7+ (pentru --directory)

Pornește un server web simplu care servește fișierele dintr-un folder, util pentru teste locale.

Sintaxă
python3 -m http.server [port] [-b adresa] [-d director]

Ce face python -m http.server

python3 -m http.server pornește un server web în folderul curent, pe portul 8000. Deschizi în browser http://localhost:8000/ și vezi fișierele: index.html dacă există, altfel lista fișierelor. Fiecare cerere este afișată în terminal. Oprești serverul cu Ctrl+C.

Îl folosești ca să vezi local o pagină HTML care încarcă fișiere JavaScript sau JSON (browserele blochează multe lucruri când deschizi direct file://) sau ca să muți rapid un fișier pe alt calculator din aceeași rețea. Nu este făcut pentru producție: nu are autentificare și verifică doar elementele de bază de securitate.

Implicit ascultă pe toate interfețele, deci și alte calculatoare din rețea îl pot accesa. Cu -b 127.0.0.1 îl limitezi la calculatorul tău. Din cod, aceleași clase (ThreadingHTTPServer, SimpleHTTPRequestHandler) se folosesc pentru servere mici de test.

Parametri

Parametru Descriere
port Portul, implicit 8000.
-b, --bind adresa Adresa pe care ascultă, de exemplu 127.0.0.1. Implicit toate interfețele.
-d, --directory folder Folderul servit. Implicit folderul curent.
-p, --protocol versiune Versiunea HTTP, implicit HTTP/1.0.

Ce returnează

Rulează până la Ctrl+C; afișează adresa și câte un rând pentru fiecare cerere.

Exemple

Exemplul 1: Servirea unui folder doar pe calculatorul tău

După ce browserul cere pagina principală și un fișier care nu există, terminalul arată cele două cereri (200 și 404).

python3 -m http.server 8000 -b 127.0.0.1 -d site

Ieșire în terminal

Serving HTTP on 127.0.0.1 port 8000 (http://127.0.0.1:8000/) ...
127.0.0.1 - - [25/Oct/2026 21:13:06] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [25/Oct/2026 21:13:06] code 404, message File not found
127.0.0.1 - - [25/Oct/2026 21:13:06] "GET /lipsa.html HTTP/1.1" 404 -

Exemplul 2: Același server pornit din cod, pentru un test

Portul 0 lasă sistemul să aleagă un port liber. Serverul rulează într-un fir separat, iar programul îl întreabă cu urllib.request. log_message este suprascrisă ca serverul să nu mai scrie în terminal.

import threading
import urllib.error
import urllib.request
from functools import partial
from http.server import SimpleHTTPRequestHandler, ThreadingHTTPServer
from pathlib import Path

Path("site").mkdir()
Path("site/index.html").write_text("<h1>Magazinul Anei</h1>", encoding="utf-8")


class Handler(SimpleHTTPRequestHandler):
    def log_message(self, format, *args):
        pass


with ThreadingHTTPServer(("127.0.0.1", 0), partial(Handler, directory="site")) as server:
    port = server.server_address[1]
    threading.Thread(target=server.serve_forever, daemon=True).start()

    with urllib.request.urlopen(f"http://127.0.0.1:{port}/") as raspuns:
        print(raspuns.status, raspuns.headers["Content-Type"])
        print(raspuns.read().decode("utf-8"))
    try:
        urllib.request.urlopen(f"http://127.0.0.1:{port}/lipsa.html")
    except urllib.error.HTTPError as e:
        print("Eroare:", e.code, e.reason)
        e.close()
    server.shutdown()

Rezultat

200 text/html
<h1>Magazinul Anei</h1>
Eroare: 404 File not found

Greșeli frecvente

  • Pornești serverul fără -b 127.0.0.1 într-o rețea publică (cafenea, cămin): oricine din rețea îți poate vedea fișierele din folder.
  • Îl folosești ca server pentru un site public. Este un server de test; în producție folosește nginx, Apache sau un server de aplicații.
  • Primești OSError: [Errno 48] Address already in use (sau Errno 98 pe Linux): portul e ocupat. Alege alt port: python3 -m http.server 8080.

Comenzi înrudite

  • requests.get(): Trimite o cerere HTTP GET și returnează răspunsul: cod de stare, antete, text sau JSON.
  • subprocess.run(): Pornește un program extern, așteaptă să se termine și îi returnează rezultatul.