Привет, меня зовут Иван, и сегодня я расскажу тебе, как устроить себе настоящий мини-сервер ― буквально в пару строк! Если ты только начинаешь своё путешествие в мир Python и веба, модуль
### Что такое WSGI и зачем он нужен?
WSGI (Web Server Gateway Interface) — это стандарт, который помогает Python-программам общаться с веб-серверами. Встроенный модуль Python
### Первый пример: “Hello, world!”
Создадим файл
Запускай скрипт, переходи в браузере на
### Как это работает?
-
-
- Возвращаемый список содержит байты, которые отдаются в ответ пользователю.
### А если хочется HTML?
Легко! Вот пример функции, отдающей HTML:
### Поддержка разных путей
Хочешь разные ответы по разным URL? Используй
Добавь эту функцию в
---
Вот так легко можно войти в веб-мир Python, используя стандартные инструменты. Не нужен ни Flask, ни Django, ни танцы с бубном — только чистый Python и твоя фантазия!
wsgiref
— это твой пропуск на этот интересный уровень.### Что такое WSGI и зачем он нужен?
WSGI (Web Server Gateway Interface) — это стандарт, который помогает Python-программам общаться с веб-серверами. Встроенный модуль Python
wsgiref
— это как виртуальный щит, который превращает твой код в простой веб-сервер. Он отлично подходит для тестов и экспериментов — идеально для начинающих!### Первый пример: “Hello, world!”
Создадим файл
server.py
:from wsgiref.simple_server import make_server
def simple_app(environ, start_response):
status = '200 OK'
headers = [('Content-type', 'text/plain; charset=utf-8')]
start_response(status, headers)
return [b"Hello, world!"]
if __name__ == '__main__':
server = make_server('localhost', 8080, simple_app)
print("Serving on http://localhost:8080/ ...")
server.serve_forever()
Запускай скрипт, переходи в браузере на
http://localhost:8080
— и ты увидишь волшебное “Hello, world!”. Именно так начинается путь любого веб-разработчика.### Как это работает?
-
make_server
создает сервер и принимает три параметра: адрес, порт и функцию-приложение.-
simple_app
— “основное блюдо”. Она получает две переменные: данные о запросе (environ
) и функцию для передачи статуса с заголовками (start_response
).- Возвращаемый список содержит байты, которые отдаются в ответ пользователю.
### А если хочется HTML?
Легко! Вот пример функции, отдающей HTML:
def html_app(environ, start_response):
status = '200 OK'
headers = [('Content-type', 'text/html; charset=utf-8')]
start_response(status, headers)
html = """
<html>
<head><title>WSGI Test</title></head>
<body><h1>Привет из wsgiref!</h1></body>
</html>
"""
return [html.encode('utf-8')]
### Поддержка разных путей
Хочешь разные ответы по разным URL? Используй
environ['PATH_INFO']
:def path_app(environ, start_response):
path = environ.get('PATH_INFO', '/')
if path == '/about':
body = "This is the About page."
else:
body = "Home page."
status = '200 OK'
headers = [('Content-type', 'text/plain; charset=utf-8')]
start_response(status, headers)
return [body.encode('utf-8')]
Добавь эту функцию в
make_server
— и твой сервер стал умнее!---
Вот так легко можно войти в веб-мир Python, используя стандартные инструменты. Не нужен ни Flask, ни Django, ни танцы с бубном — только чистый Python и твоя фантазия!
👍1
Привет! С вами Иван, и сегодня я расскажу о таинственном царстве двоичных (binary) файлов в Python. Мы так привыкли работать с текстом, что забываем: музыка, картинки, да что уж там — даже документ Word — внутри состоят из байтов, а не буковок.
## Чем отличаются двоичные файлы?
Когда мы читаем или пишем файл в текстовом режиме, Python заботится о кодировке: превращает байты в строки и обратно. Но с бинарными данными так не получится — они воспринимаются как сырые байты (
## Как открыть двоичный файл?
Легко! Достаточно добавить к режиму
Здесь
## Чтение двоичных файлов
Открываем файл в режиме
Получили на выходе тип
## Запись последовательности байтов
Все просто: передаем в write объект
## Немного магии с модулем struct
Если нужно упаковать не просто числа, а, например, float или значения разных типов, поможет модуль
А вот как распаковать обратно:
## Итоги
Двоичные файлы — не страшное чудовище, а удобный способ для работы с «сырыми» данными любого типа. Их невозможно случайно «испортить» сменой кодировки, зато можно ловко управлять байтами и экономить место.
## Чем отличаются двоичные файлы?
Когда мы читаем или пишем файл в текстовом режиме, Python заботится о кодировке: превращает байты в строки и обратно. Но с бинарными данными так не получится — они воспринимаются как сырые байты (
bytes
). Это важно, если вы, например, работаете с изображениями или сериализуете объекты.## Как открыть двоичный файл?
Легко! Достаточно добавить к режиму
'r'
, 'w'
или 'a'
букву 'b'
:with open('example.bin', 'wb') as bin_file:
bin_file.write(b'Hello, world!')
Здесь
'wb'
означает write binary — никаких странных символов перевода строки и прочих неожиданностей.## Чтение двоичных файлов
Открываем файл в режиме
'rb'
— читаем байты:with open('example.bin', 'rb') as bin_file:
data = bin_file.read()
print(data) # Выведет: b'Hello, world!'
Получили на выходе тип
bytes
. Каждый элемент такого объекта — число от 0 до 255.## Запись последовательности байтов
Все просто: передаем в write объект
bytes
или bytearray
. Например, сохраним несколько чисел в файл:numbers = [27, 255, 128, 42]
byte_data = bytes(numbers)
with open('numbers.bin', 'wb') as bin_file:
bin_file.write(byte_data)
## Немного магии с модулем struct
Если нужно упаковать не просто числа, а, например, float или значения разных типов, поможет модуль
struct
— он превращает числа и структуры в байты и обратно:import struct
packed = struct.pack('if', 7, 3.14) # 'i' — целое, 'f' — float
with open('struct.bin', 'wb') as bin_file:
bin_file.write(packed)
А вот как распаковать обратно:
with open('struct.bin', 'rb') as bin_file:
data = bin_file.read()
number, value = struct.unpack('if', data)
print(number, value) # 7 3.14
## Итоги
Двоичные файлы — не страшное чудовище, а удобный способ для работы с «сырыми» данными любого типа. Их невозможно случайно «испортить» сменой кодировки, зато можно ловко управлять байтами и экономить место.
👍1
Привет! С вами Иван, и сегодня мы разберёмся с созданием собственных Python-пакетов для повторного использования кода c помощью
## Почему это важно?
Рано или поздно каждый сталкивается с ситуацией: вот отличная функция для обработки даты, и вот она снова нужна — в новом проекте. Перетаскивать файлы вручную – прошлый век! Пакеты решают эту проблему. Помимо удобства, это ещё и первый шаг к публикации в PyPI.
## Минимальный пакет: поехали!
Для примера создадим папку
Теперь создадим файл
Скелет готов!
## Настраиваем setup.py
Теперь самая магия —
## Установка пакета
Перейдите в папку выше и установите пакет локально:
Флаг
## Используем в реальном коде
Готово! Теперь можно импортировать функции из любого места:
## Итоги
Создавать свои пакеты с помощью
setuptools
. Терпеть не могу копировать функции из одного проекта в другой! К счастью, Python позволяет упаковать полезные модули, чтобы потом легко их устанавливать через pip.## Почему это важно?
Рано или поздно каждый сталкивается с ситуацией: вот отличная функция для обработки даты, и вот она снова нужна — в новом проекте. Перетаскивать файлы вручную – прошлый век! Пакеты решают эту проблему. Помимо удобства, это ещё и первый шаг к публикации в PyPI.
## Минимальный пакет: поехали!
Для примера создадим папку
awesome_math
, а внутри — файл operations.py
:# operations.py
def add(a, b):
return a + b
def multiply(a, b):
return a * b
Теперь создадим файл
__init__.py
(даже если он пустой):# __init__.py
from .operations import add, multiply
Скелет готов!
## Настраиваем setup.py
Теперь самая магия —
setup.py
:from setuptools import setup, find_packages
setup(
name="awesome_math",
version="0.1",
packages=find_packages(),
author="Ivan",
description="Sample package for math operations",
python_requires=">=3.6",
)
## Установка пакета
Перейдите в папку выше и установите пакет локально:
pip install -e ./awesome_math
Флаг
-e
(“editable”) позволяет менять код пакета на лету — удобно для отладки.## Используем в реальном коде
Готово! Теперь можно импортировать функции из любого места:
from awesome_math import add, multiply
print(add(2, 3)) # 5
print(multiply(4, 5)) # 20
## Итоги
Создавать свои пакеты с помощью
setuptools
— просто и удобно. Такой подход организует код, ускоряет разработку и позволяет делиться своими наработками с коллегами (или со всем миром!). Я всегда советую автоматизировать повторяющиеся задачи, а свой пакет — лучший способ избавиться от рутины.👍1