Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
37bef9b
Создан проект
SpriteSpirit May 25, 2025
05c0782
Реализован шаблон для приложения погоды
SpriteSpirit May 25, 2025
a1006ea
Реализован асинхронный сервис для получения погоды через API Яндекс.П…
SpriteSpirit May 25, 2025
334a90b
Реализована модель города
SpriteSpirit May 25, 2025
bd0bfaf
Миграции
SpriteSpirit May 25, 2025
589e08d
Реализована функция для получения координат по названию города
SpriteSpirit May 25, 2025
ce8b2b3
Реализована модель для хранения истории поиска
SpriteSpirit May 26, 2025
db90c01
Реализован сериализатор для отображения статистики поиска
SpriteSpirit May 26, 2025
3daa320
Реализован сервис для получения погоды через Яндекс.Погода
SpriteSpirit May 26, 2025
d3e2956
Реализовано представление для получения данных погоды и класс для пол…
SpriteSpirit May 26, 2025
2fa5f38
Настроена админ панель и прописаны маршруты
SpriteSpirit May 26, 2025
387c885
Добавлены шаблоны для сайта
SpriteSpirit May 26, 2025
66de5b9
Реализованы настраиваемые теги для доп.функционала и перевода
SpriteSpirit May 26, 2025
400b204
Настроена маршрутизация
SpriteSpirit May 26, 2025
b30f62a
Добавлена таблица стилей
SpriteSpirit May 26, 2025
517abd5
Реализованы тесты
SpriteSpirit May 26, 2025
3b551f2
Реализовано приложение пользователя
SpriteSpirit May 26, 2025
86ef4cf
Добавлены настройки
SpriteSpirit May 26, 2025
03464f1
Удален лишний модуль
SpriteSpirit May 26, 2025
56abee3
Добавлен rest_framework
SpriteSpirit May 26, 2025
f1e354f
Добавлены настройки для тестирования
SpriteSpirit May 26, 2025
be76c77
Добавлена переменная для настроек
SpriteSpirit May 26, 2025
9da75e1
Обновлен и дополнен README.md
SpriteSpirit May 26, 2025
75bd4aa
Миграции
SpriteSpirit May 26, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions 10 .env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# django
SECRET_KEY=
DEBUG=False

# yandex weather
YANDEX_GEOCODER_KEY=
YANDEX_WEATHER_KEY=
YANDEX_SUGGEST_KEY=

DJANGO_SETTINGS_MODULE=
3 changes: 2 additions & 1 deletion 3 .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@
__pycache__/
*.py[cod]
*$py.class

/.idea
.xml
# C extensions
*.so

Expand Down
20 changes: 20 additions & 0 deletions 20 Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
FROM python:3.13-slim

ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1

RUN apt-get update && apt-get install -y \
build-essential \
libpq-dev \
&& rm -rf /var/lib/apt/lists/*

WORKDIR /app

RUN pip install --no-cache-dir uv
COPY pyproject.toml uv.lock ./

RUN uv pip install --system -r uv.lock

COPY . .

EXPOSE 8000
160 changes: 160 additions & 0 deletions 160 README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,160 @@
# Weather Web Application

Веб-приложение для получения прогноза погоды по названию города.

---

## Оглавление

- [Описание проекта](#описание-проекта)
- [Реализованный функционал](#реализованный-функционал)
- [Технологии](#технологии)
- [Как запустить проект](#как-запустить-проект)
- [Требования](#требования)
- [Запуск с помощью Docker](#запуск-с-помощью-docker)
- [Тестирование и линтинг](#тестирование-и-линтинг)
- [Контакты](#контакты)

---

## Описание проекта

Это веб-приложение позволяет получать прогноз погоды по введённому названию города. Приложение выводит данные о погоде в удобном формате:
- Прогноз на сегодня.
- Прогноз на 3 дня вперёд.

При вводе города реализовано автодополнение с помощью Яндекс.Геосаджеста, что упрощает выбор нужного города. Также в приложении сохраняется история поисковых запросов, и при повторном посещении сайта пользователю предлагается посмотреть погоду в последнем искомом городе.

Кроме веб-интерфейса, реализован API-эндпоинт `/api/stats/` для отображения статистики поисковых запросов (какой город сколько раз искали), отсортированной по популярности.

---

## Реализованный функционал

- **Основной функционал**:
- Ввод названия города.
- Получение прогноза погоды.

- **Достоверное отображение прогноза**:
- Прогноз на сегодня.
- Прогноз на 3 дня вперёд.

- **Тестирование**:
- Написаны тесты для `views` и `services` с использованием `pytest` и `mock`.

- **Контейнеризация**:
- Приложение полностью обернуто в Docker-контейнеры (`web`, `db`).

- **Автодополнение**:
- Реализовано подсказки при вводе города с помощью Яндекс.Геосаджеста.

- **Сессии Django**:
- При повторном посещении сайта предлагается посмотреть погоду в последнем искомом городе.

- **История поиска**:
- Сохраняется общая история поиска городов.

- **API статистики**:
- Эндпоинт `/api/stats/` показывает статистику поисковых запросов.

---

## Технологии

- **Backend**: Python, Django, Django REST Framework
- **База данных**: PostgreSQL
- **Frontend**: HTML, CSS, JavaScript (используется API Яндекс.Карт)
- **API погоды**:
- Яндекс.Погода
- Яндекс.Геокодер
- Яндекс.Геосаджест
- **Тестирование**: Pytest, pytest-django, Mock
- **Линтинг и форматирование**: Ruff
- **Контейнеризация**: Docker, Docker Compose
- **Менеджер пакетов**: uv

---

## Как запустить проект

### Требования

- Docker
- Docker Compose

### Запуск с помощью Docker

1. **Клонируйте репозиторий:**

```bash
git clone <your-repo-url>
cd weather_project
```

2. **Создайте файл `.env`:**

```bash
cp example.env .env
```

3. **Заполните `.env` своими данными:**

```env
DJANGO_SECRET_KEY='your-django-secret-key'
YANDEX_API_KEY='your-yandex-api-key-for-weather-and-geocoder'
YANDEX_JS_API_KEY='your-yandex-js-api-key-for-suggest'

# PostgreSQL
POSTGRES_DB=weather_db
POSTGRES_USER=weather_user
POSTGRES_PASSWORD=strongpassword
POSTGRES_HOST=db
POSTGRES_PORT=5432
```

4. **Сборка и запуск контейнеров:**

```bash
docker-compose up --build -d
```

5. **Применение миграций:**

```bash
docker-compose exec web python manage.py migrate
```

После выполнения этих шагов приложение будет доступно по адресу: [http://localhost:8000](http://localhost:8000)
API статистики будет работать по адресу: [http://localhost:8000/api/stats/](http://localhost:8000/api/stats/)

---

## Тестирование и линтинг

### Запуск тестов

```bash
docker-compose exec web pytest
```

Что тестируется:
- Корректность работы с API Яндекса (с моками запросов).
- Сохранение истории поиска.
- Логика сессий (последний город).
- Формат ответа API статистики.

### Проверка стиля кода (Ruff)

```bash
docker-compose exec web ruff check .
```

#### Автоисправление ошибок с помощью Ruff:

```bash
docker-compose exec web ruff check --fix .
```

---

*Наслаждайтесь использованием Weather Web Application!*
31 changes: 31 additions & 0 deletions 31 docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
services:
db:
image: postgres:14-alpine
container_name: weather_db
volumes:
- postgres_data:/var/lib/postgresql/data/
environment:
- POSTGRES_DB=${DB_NAME}
- POSTGRES_USER=${DB_USER}
- POSTGRES_PASSWORD=${DB_PASSWORD}

web:
build: .
container_name: weather_web
command: python src/manage.py runserver 0.0.0.0:8000
volumes:
- .:/app
- static_volume:/app/src/static
ports:
- "8000:8000"
environment:
- DB_HOST=db
- DB_NAME=${DB_NAME}
- DB_USER=${DB_USER}
- DB_PASSWORD=${DB_PASSWORD}
depends_on:
- db

volumes:
postgres_data:
static_volume:
35 changes: 34 additions & 1 deletion 35 pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,37 @@ name = "weather-web"
version = "0.1.0"
description = "Add your description here"
requires-python = ">=3.13"
dependencies = []

dependencies = [
"django>=5.2.1",
"django-location-field>=2.7.3",
"django-rest-framework>=0.1.0",
"djangorestframework>=3.16.0",
"httpx>=0.28.1",
"psycopg2-binary",
"pytest>=8.3.5",
"pytest-django>=4.11.1",
"pytest-mock>=3.14.1",
"python-dotenv>=1.1.0",
"requests>=2.32.3",
"six>=1.17.0",
]

[tool.ruff]
line-length = 120 # Общая настройка длины строки
target-version = "py313" # Указываем версию Python
exclude = [ # Исключаемые файлы/папки
".venv",
"__pycache__",
"build",
"dist",
"migrations"
]

[tool.ruff.lint]
select = ["E", "F", "I", "N", "UP", "B", "A"]
ignore = ["E501"]
fixable = ["ALL"]

[tool.ruff.lint.isort]
known-first-party = ["my_package"]
Empty file added 0 src/config/__init__.py
Empty file.
16 changes: 16 additions & 0 deletions 16 src/config/asgi.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
"""
ASGI config for config project.
It exposes the ASGI callable as a module-level variable named ``application``.
For more information on this file, see
https://docs.djangoproject.com/en/5.2/howto/deployment/asgi/
"""

import os

from django.core.asgi import get_asgi_application

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings")

application = get_asgi_application()
Loading
Morty Proxy This is a proxified and sanitized view of the page, visit original site.