Открываю тайны мироздания: абсолютно любой веб-сайт технически - это программа, которая умеет принимать
HTTP запросы и возвращать в ответ на них какие-то данные (в HTTP ответ завёрнутые). На этом всё. Я серьёзно.
Поэтому на верхнем уровне разработка сайта на питоне без использования веб-фреймворков выглядит точно так же, как с их использованием: вы пишете код для каждого маршрута, предполагаемого на вашем сайте, а при развёртывании запускаете программу веб-сервера, которая будет слушать HTTP запросы. Ну или даже HTTPS ещё сразу запилите 😏. Этот процесс будет одинаков, какой бы язык вы ни выбрали, питон, пыхпых, плюсы, шарп, жабу, хаскелл, лисп, пролог, без разницы.
Отличие будет в том, что без фреймворков типа django вам придётся очень много традиционных и ожидаемых для веб-разработки вещей написать с нуля. В стандартных библиотеках Python 3 есть группа модулей
http, которые содержат классы для элементарной работы с HTTP запросами, но, судя по тому, что там написано в документации, вам придётся написать самостоятельно вообще всё:
- маршрутизацию - парсить строку запроса urllib'ом и по результатам выбирать, какую функцию выполнить;
- шаблонизатор - питон это не PHP, для генерации HTML ответов, которые могут быть огромного размера, нужно тоже придумать что-то более удобное, кроме конкатенации строк;
- сессии - молитесь на разработчиков питона, что они потрудились написать http.cookies, но всё остальное придётся написать ручками;
- парсинг тела запроса - BaseHTTPRequestHandler даёт вам только io.BufferedIOBase поток, вам придётся разобрать вручную, что там вам посылает браузер в теле запроса: JSON, XML, x-www-form-urlencoded или вообще файлы;
- генерация правильного HTTP ответа - код статуса и все нужные заголовки, включая печеньки, нужно не забывать проставить в каждом маршруте соответственно тому, какое тело мы возвращаем. Тело возвращается опять же, через поток вывода, а не каким-нибудь более удобным способом.
Я не упоминаю сейчас вообще вопросы фронт-энда: какой HTML будет на веб-страницах и как его генерировать, как организованы CSS стили, будет ли там JS скриптинг и как организовано хранение (генерация?) Javascript кода, это всё придётся решать потом, по мере усложнения ваших веб-страниц. Для веб-сервера это всё побочные вещи, он просто текст в поток вывода пишет.
Если у вас полностью статический веб-сайт, то есть, все веб-страницы хранятся в уже готовых файлах, и ничего, кроме файлов (.html, .css, .js, картинки, шрифты) веб-сервер отдавать не будет, то можно обойтись вот таким кодом с использованием стандартного класса
http.server.SimpleHTTPRequestHandler:
import http.server
import socketserver
ServerAddress = ("", 8000)
RequestHandler = http.server.SimpleHTTPRequestHandler
with socketserver.TCPServer(ServerAddress, RequestHandler) as httpd:
httpd.serve_forever()
(полностью украдено из документации)
После того, как вы напишете всю вышеперечисленную базовую функциональность, от современных веб-приложений обычно ожидаются и более сложные вещи, например, защита от CSRF, сложные формы аутентификации типа OAuth2, авторизация по ролям, кэширование и так далее.
Более того, возможно, на определённом этапе функционал или производительность стандартного http.server вас перестанет устраивать, а это значит, что нужно будет опуститься на один уровень абстракции ниже и написать свой HTTP сервер на базе
sockerserver.TCPServer, впрочем, если вы будете способны самостоятельно решить такую задачу, на этом уровне вам уже не нужен будет Яндекс.Кью.
Для поддержки всего, что я написал выше, вы напишете, фактически, свой веб-фреймворк. Возможно, это будет оправдано. А возможно, нет.