diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index f28ecca..21d8260 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -1,6 +1,9 @@ name: ci -on: push +on: + push: + branches: + - main jobs: build: diff --git a/weather_project/weather/views.py b/weather_project/weather/views.py index 1264ac7..0170ff2 100644 --- a/weather_project/weather/views.py +++ b/weather_project/weather/views.py @@ -1,26 +1,49 @@ +import os +import time +import logging import requests from django.shortcuts import render +logger = logging.getLogger(__name__) + API_KEY = 'a7cc162fc60a76d2e31461071634b8ce' +def get_weather_data(city): + url = f'https://api.openweathermap.org/data/2.5/weather?q={city}&appid={API_KEY}&units=metric&lang=en' + logger.info(f"[weather_request] city={city}") + response = requests.get(url) + response.raise_for_status() + data = response.json() + logger.debug(f"[weather_response] city={city} response={data}") + return { + 'city': city, + 'temperature': data['main']['temp'], + 'description': data['weather'][0]['description'], + 'icon': data['weather'][0]['icon'], + } + def index(request): weather_data = None error = None - if request.method == 'POST': - city = request.POST.get('city') - if city: - url = f'https://api.openweathermap.org/data/2.5/weather?q={city}&appid={API_KEY}&units=metric&lang=eng' - response = requests.get(url) - if response.status_code == 200: - data = response.json() - weather_data = { - 'city': city, - 'temperature': data['main']['temp'], - 'description': data['weather'][0]['description'], - 'icon': data['weather'][0]['icon'] - } - else: - error = 'City not found' + if request.method == "POST": + city = request.POST.get("city") + start = time.time() - return render(request, 'weather/index.html', {'weather': weather_data, 'error': error}) + try: + weather_data = get_weather_data(city) + duration = time.time() - start + logger.info(f"[weather_success] city={city} duration={duration:.3f}s temp={weather_data['temperature']}") + + except requests.HTTPError as http_err: + error = f"HTTP error: {http_err}" + logger.warning(f"[weather_http_error] city={city} error={http_err}") + + except Exception as e: + error = "Something went wrong." + logger.exception(f"[weather_unexpected_error] city={city} error={e}") + + return render(request, 'weather/index.html', { + 'weather': weather_data, + 'error': error, + }) diff --git a/weather_project/weather_project/settings.py b/weather_project/weather_project/settings.py index b02663c..d5b276a 100644 --- a/weather_project/weather_project/settings.py +++ b/weather_project/weather_project/settings.py @@ -122,3 +122,35 @@ STATIC_URL = 'static/' # https://docs.djangoproject.com/en/5.1/ref/settings/#default-auto-field DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' + +LOGGING = { + 'version': 1, + 'disable_existing_loggers': False, + 'formatters': { + 'standard': { + 'format': '[%(levelname)s] %(asctime)s %(name)s: %(message)s', + }, + }, + 'handlers': { + 'console': { + 'class': 'logging.StreamHandler', + 'formatter': 'standard', + }, + }, + 'root': { + 'handlers': ['console'], + 'level': 'INFO', + }, + 'loggers': { + 'django': { + 'handlers': ['console'], + 'level': 'WARNING', + 'propagate': False, + }, + 'weather': { + 'handlers': ['console'], + 'level': 'INFO', + 'propagate': False, + }, + }, +}