Как создать веб-приложение на Python без использования фреймворков

Ответ

Создать веб-приложение на Python без фреймворков можно с помощью модулей из стандартной библиотеки. Это полезно для понимания основ работы веба, но не рекомендуется для production-систем из-за отсутствия многих удобств и средств защиты.

Существует несколько подходов разного уровня абстракции:

  1. http.server (Высокоуровневый): Простой способ запустить HTTP-сервер. Подходит для простых обработчиков и прототипов.

    from http.server import BaseHTTPRequestHandler, HTTPServer
    
    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>Привет, мир!</h1>")
    
    def run(server_class=HTTPServer, handler_class=SimpleHandler, port=8000):
        server_address = ('', port)
        httpd = server_class(server_address, handler_class)
        print(f"Сервер запущен на порту {port}")
        httpd.serve_forever()
    
    run()
  2. wsgiref (Стандартный интерфейс): Реализация стандарта WSGI (Web Server Gateway Interface), который разделяет сервер и приложение. Это основа большинства Python-фреймворков.

    from wsgiref.simple_server import make_server
    
    # WSGI-приложение
    def application(environ, start_response):
        status = '200 OK'
        headers = [('Content-type', 'text/plain; charset=utf-8')]
        start_response(status, headers)
        return [b"Hello, WSGI World!"]
    
    with make_server('', 8000, application) as httpd:
        print("Сервер запущен на порту 8000...")
        httpd.serve_forever()
  3. socket (Низкоуровневый): Прямая работа с сокетами. Дает полный контроль, но требует ручной реализации всего HTTP-протокола.

    import socket
    
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socket.bind(('localhost', 8080))
    server_socket.listen(1)
    
    print("Сервер слушает порт 8080...")
    
    while True:
        conn, addr = server_socket.accept()
        request = conn.recv(1024)
        # Упрощенный ответ, не парсим запрос
        response = b"HTTP/1.1 200 OKrnContent-Length: 13rnrnHello, Socket!"
        conn.sendall(response)
        conn.close()

Вывод: Использование стандартных библиотек — отличный способ изучить, как веб-серверы работают «под капотом», но для реальных проектов фреймворки (FastAPI, Django, Flask) предоставляют необходимую структуру, безопасность и инструменты для быстрой разработки.