django-weather/weather_project/weather/views.py
evdo 16aa25a588
All checks were successful
ci / build (push) Successful in 36s
Added email sending
2025-04-01 15:20:23 +02:00

76 lines
No EOL
2.3 KiB
Python

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})