HTTP-сервер на Python (без внешних зависимостей) для расчёта скорингового балла и получения интересов клиентов.
| Файл | Описание |
|---|---|
api.py |
Основной файл сервера (с type hints) |
scoring.py |
Логика расчёта счёта и интересов |
test.py |
Юнит-тесты |
# Запуск на порту 8080 (по умолчанию)
python api.py
# Запуск на указанном порту с логированием
python api.py --port 9000 --log logs/main.logСервер слушает localhost на указанном порту.
python test.pyЕдинственная точка входа: POST /method
{
"account": "string",
"login": "string",
"token": "string",
"method": "string",
"arguments": {}
}Токен — SHA-512 хеш, зависит от типа пользователя:
- Обычный пользователь:
sha512(account + login + "Otus") - Администратор (login =
"admin"):sha512(YYYYmmddHH + "42"), гдеYYYYmmddHH— текущее время с точностью до часа
arguments:
| Поле | Тип | Описание |
|---|---|---|
phone |
str / int | Телефон, 11 символов, начинается с 7 |
email |
str | Email (должен содержать @) |
birthday |
str | Дата в формате DD.MM.YYYY (не старше 70 лет) |
gender |
int | 0 — неизвестен, 1 — мужской, 2 — женский |
first_name |
str | Имя |
last_name |
str | Фамилия |
Требуется хотя бы одна пара: phone+email, first_name+last_name или gender+birthday.
Ответ:
{
"response": { "score": 3.0 },
"code": 200
}arguments:
| Поле | Тип | Описание |
|---|---|---|
client_ids |
int[] | Список ID клиентов (обязательно) |
date |
str | Дата в формате DD.MM.YYYY (опционально) |
Ответ:
{
"response": {
"1": ["sport", "music"],
"2": ["travel", "books"]
},
"code": 200
}import hashlib, datetime
# Обычный пользователь
token = hashlib.sha512(("horns&hoofs" + "h&f" + "Otus").encode()).hexdigest()
# Администратор
token = hashlib.sha512(datetime.datetime.now().strftime("%Y%m%d%H") + "42").hexdigest()TOKEN=$(python3 -c "import hashlib; print(hashlib.sha512('horns&hoofsh&fOtus'.encode()).hexdigest())")
curl -X POST http://localhost:8080/method \
-H "Content-Type: application/json" \
-d "{
\"account\": \"horns&hoofs\",
\"login\": \"h&f\",
\"token\": \"$TOKEN\",
\"method\": \"online_score\",
\"arguments\": {
\"phone\": \"79175002040\",
\"email\": \"user@otus.ru\"
}
}"TOKEN=$(python3 -c "import hashlib; print(hashlib.sha512('horns&hoofsh&fOtus'.encode()).hexdigest())")
curl -X POST http://localhost:8080/method \
-H "Content-Type: application/json" \
-d "{
\"account\": \"horns&hoofs\",
\"login\": \"h&f\",
\"token\": \"$TOKEN\",
\"method\": \"clients_interests\",
\"arguments\": {
\"client_ids\": [1, 2, 3]
}
}"| Код | Значение |
|---|---|
| 200 | Успех |
| 400 | Неверный формат запроса |
| 403 | Ошибка аутентификации |
| 404 | Найдена неизвестная конечная точка |
| 422 | Ошибка валидации данных |
| 500 | Внутренняя ошибка сервера |