Создание локального сервера на Python для веб-разработки

Раздел: Веб-разработка -> Веб-серверы

Основные подходы к созданию локального сервера на Python

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

Flask - легковесный микрофреймворк, идеально подходящий для быстрой разработки веб-приложений или API. Он не требует сложной настройки и имеет понятную документацию.

Установка Flask:

pip install flask

Https сервер python (http сервер на python)

Пример простейшего сервера с одним маршрутом:

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
    return 'Привет, мир!'

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000, debug=True)

Code server python (сервер кода python (code-server))

Пояснение шагов:

  • from flask import Flask - импорт класса Flask.
  • app = Flask(__name__) - создание экземпляра приложения.
  • @app.route('/') - декоратор для привязки функции к корневому URL.
  • app.run(...) - запуск сервера на всех интерфейсах (0.0.0.0) и порту 5000. Режим отладки позволяет автоматически перезагружать сервер при изменении кода.

Типичные проблемы:

  • Порт занят: если порт 5000 уже используется, измените его на другой (port=5001).
  • CORS: при запросах из браузера с другого домена может потребоваться установка flask-cors.
  • Кодировка: если в ответе кириллица отображается некорректно, убедитесь, что файл сохранён в UTF-8.

Как быстро раздать файлы по HTTP без установки дополнительных библиотек?

Встроенный модуль http.server (Python 3) позволяет поднять сервер для статических файлов одной командой:

python -m http.server 8000

локальный сервер python (локальный сервер на python)

Сервер раздаёт содержимое текущей директории по адресу http://localhost:8000.

Для использования в скрипте:

from http.server import HTTPServer, SimpleHTTPRequestHandler

server = HTTPServer(('0.0.0.0', 8000), SimpleHTTPRequestHandler)
print('Сервер запущен на port 8000')
server.serve_forever()

Типичные ошибки:

  • В Windows команда python -m http.server может не сработать, если Python не добавлен в PATH - используйте полный путь или установите соответствие.
  • Сервер не обрабатывает динамические запросы - только статику.

Как создать современный асинхронный сервер с автоматической документацией?

FastAPI - современный фреймворк для создания API с поддержкой асинхронности и автоматической генерацией документации (OpenAPI).

Установка:

pip install fastapi uvicorn

Пример сервера:

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
async def read_root():
    return {"message": "Привет, FastAPI"}

Запуск через Uvicorn:

uvicorn main:app --reload --host 0.0.0.0 --port 8000

Пояснения: Uvicorn - ASGI-сервер. Флаг --reload включает перезагрузку при изменениях кода.

Проблемы:

  • При использовании асинхронных библиотек (например, httpx) могут возникать конфликты событийного цикла - избегайте смешивания синхронного и асинхронного кода без явных обёрток.
  • Документация доступна по адресам /docs и /redoc - убедитесь, что они не перекрыты собственными маршрутами.

Как построить высокопроизводительный асинхронный сервер с поддержкой WebSocket?

aiohttp - библиотека для асинхронных HTTP-клиентов и серверов. Она предоставляет низкоуровневый контроль над запросами.

Установка:

pip install aiohttp

Пример простого сервера:

from aiohttp import web

async def handle(request):
    return web.Response(text='Привет, aiohttp!')

app = web.Application()
app.router.add_get('/', handle)
web.run_app(app, host='0.0.0.0', port=8080)

Проблемы:

  • Необходимо явно управлять контекстом при использовании сессий - не забывайте вызывать await app.shutdown() при грамотном завершении.
  • Для работы с WebSocket требуются дополнительные обработчики, что сложнее, чем во Flask.

Расширенные примеры локальных серверов на Python

Flask: REST API с CRUD операциями

Пример
from flask import Flask, request, jsonify

app = Flask(__name__)

items = []

@app.route('/items', methods=['GET'])
def get_items():
    return jsonify(items)

@app.route('/items', methods=['POST'])
def create_item():
    data = request.get_json()
    data['id'] = len(items) + 1
    items.append(data)
    return jsonify(data), 201

@app.route('/items/<int:item_id>', methods=['DELETE'])
def delete_item(item_id):
    global items
    items = [item for item in items if item['id'] != item_id]
    return '', 204

if __name__ == '__main__':
    app.run(debug=True)

Результат тестирования через curl:

$ curl -X POST http://localhost:5000/items -H "Content-Type: application/json" -d '{"name":"Тест"}'
{"id":1,"name":"Тест"}

$ curl http://localhost:5000/items
[{"id":1,"name":"Тест"}]

FastAPI: сервер с валидацией данных через Pydantic

Пример
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel

app = FastAPI()

class Item(BaseModel):
    name: str
    price: float

@app.post("/items")
async def create_item(item: Item):
    if item.price < 0:
        raise HTTPException(status_code=400, detail="Цена не может быть отрицательной")
    return {"message": f"Товар {item.name} создан", "price": item.price}

Запуск:

Пример
uvicorn main:app --reload

Результат POST-запроса с валидными данными:

$ curl -X POST http://localhost:8000/items -H "Content-Type: application/json" -d '{"name":"Книга","price":500}'
{"message":"Товар Книга создан","price":500.0}

Результат с невалидными данными (отрицательная цена):

$ curl -X POST http://localhost:8000/items -H "Content-Type: application/json" -d '{"name":"Книга","price":-10}'
{"detail":"Цена не может быть отрицательной"}

aiohttp: сервер с WebSocket для чата

Пример
from aiohttp import web
import aiohttp

async def websocket_handler(request):
    ws = web.WebSocketResponse()
    await ws.prepare(request)
    print(f"Новое подключение: {request.remote}")
    async for msg in ws:
        if msg.type == aiohttp.WSMsgType.TEXT:
            print(f"Получено: {msg.data}")
            await ws.send_str(f"Эхо: {msg.data}")
        elif msg.type == aiohttp.WSMsgType.CLOSED:
            break
    return ws

app = web.Application()
app.router.add_get('/ws', websocket_handler)
web.run_app(app, host='0.0.0.0', port=8080)

Клиент для тестирования (JavaScript в браузере):

Пример
const socket = new WebSocket('ws://localhost:8080/ws');
socket.onmessage = function(event) {
    console.log('Ответ:', event.data);
};
socket.send('Привет!');

Результат в консоли сервера:

Новое подключение: 127.0.0.1
Получено: Привет!

http.server: раздача статики с поддержкой CGI

Пример
from http.server import HTTPServer, CGIHTTPRequestHandler

server = HTTPServer(('0.0.0.0', 8000), CGIHTTPRequestHandler)
print('Сервер запущен на http://localhost:8000')
server.serve_forever()

Для работы CGI необходимо создать папку cgi-bin и поместить туда скрипты с правами на выполнение.

Локальный сервер на Python - comments

En
локальный сервер python (python)