import os import time import logging import requests import json import uuid from django.shortcuts import render, redirect from django_celery_beat.models import PeriodicTask, CrontabSchedule from django.utils import timezone from .forms import EmailScheduleForm from .tasks import send_weather_email 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") start = time.time() 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"Weather in {city} can't be found" logger.error(f"[weather_http_error] city={city} error={http_err}") weather_data = None 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, }) def schedule_email_view(request): email_sent = False if request.method == 'POST': form = EmailScheduleForm(request.POST) if form.is_valid(): city = form.cleaned_data['city'] email = form.cleaned_data['email'] send_weather_email.delay(city, email) email_sent = True # флаг для шаблона else: form = EmailScheduleForm() return render(request, 'weather/schedule_email.html', {'form': form, 'email_sent': email_sent})