Будівництво погодної панелі з Flask, React та AWS S3: Покроковий посібник

Вступ

Цей блог розгляне, як створити повноцінне веб-застосування для відображення погоди, яке отримує дані про погоду в реальному часі та прогнози, зберігає їх у AWS S3 і відображає на зручному інтерфейсі. Цей проєкт поєднує бекенд-розробку з Flask і Python, фронтенд-розробку з React і інтеграцію з хмарними сервісами AWS S3.

GitHub: https://github.com/HARSHALJETHWA19/Weather-Dashboard

Особливості Weather Dashboard

  • Пошук погоди по місту: Введіть назву міста для отримання поточного стану погоди та 7-денної прогнози.
  • Інтеграція з AWS S3: Зберігайте отримані дані про погоду в AWS S3 для постійного зберігання.
  • Динамічний інтерфейс: Інтерфейс на базі React для відображення інформації про погоду.
  • Інтеграція з API: Отримуйте дані про погоду через OpenWeather API.
  • Підтримка CORS: Безперешкодна комунікація між бекендом і фронтендом.

Необхідні умови

Перед тим як почати, переконайтеся, що у вас встановлено:

  1. Python 3.x
  2. Node.js і npm
  3. AWS CLI
  4. Середовище для розробки React

Налаштування проєкту

1. Клонування репозиторію

git clone https://github.com/your-repo/weather-dashboard.git  
cd weather-dashboard

2. Налаштування бекенду

Встановлення залежностей

flask  
boto3  
requests  
python-dotenv  
pytest  
moto
pip install -r requirements.txt

Налаштування змінних середовища

Створіть файл .env у директорії backend/src з таким вмістом:

echo "OPENWEATHER_API_KEY=your_api_key" >> .env  
echo "AWS_BUCKET_NAME=your_bucket_name" >> .env

Замість your_api_key використайте ваш API ключ від OpenWeather, а your_bucket_name — назву вашого бакету в AWS S3.

Налаштування AWS облікових даних

Переконайтеся, що ваш AWS CLI налаштований з необхідними обліковими даними:

aws configure

Запуск бекенду

Перейдіть до директорії бекенду і запустіть застосунок:

python backend/src/weather_dashboard.py

3. Налаштування фронтенду

Перейдіть до директорії фронтенду

mkdir frontend  
cd ../frontend

Встановлення залежностей

npx create-react-app .  
npm install axios chart.js react-chartjs-2

Запуск фронтенду

npm start

Ваш React застосунок тепер має працювати на http://localhost:3000.

Робочий процес застосунку

1. Введіть назву міста

Користувачі можуть ввести назву міста в поле введення на фронтенді та відправити форму.

2. Отримання даних про погоду

Фронтенд надсилає POST запит до API бекенду на адресу http://localhost:5000/weather.

3. Зберігання даних у AWS S3

Бекенд отримує дані з OpenWeather API, обробляє їх і зберігає у AWS S3.

4.

Виведення даних на фронтенд

Бекенд відповідає з даними про погоду, які React застосунок використовує для динамічного оновлення інтерфейсу.

Огляд коду

Бекенд (Flask)

Основні кінцеві точки

  • /weather (POST): Отримує дані про погоду для заданого міста та зберігає їх в AWS S3.

Приклад коду на Python

from flask import Flask, request, jsonify  
from flask_cors import CORS  
import requests  
import boto3  
import os  
import json  
from datetime import datetime  

app = Flask(__name__)  
CORS(app) # Включення підтримки CORS  

API_KEY = os.getenv("OPENWEATHER_API_KEY")  
AWS_BUCKET_NAME = os.getenv("AWS_BUCKET_NAME")  
S3_CLIENT = boto3.client("s3")  

def save_to_s3(city, weather_data, forecast_data):  
 """Зберігає дані про погоду та прогноз у S3."""  
 timestamp = datetime.now().strftime('%Y%m%d-%H%M%S')  
 file_name = f"weather-data/{city}-{timestamp}.json"  
 data_to_save = {  
 "weather": weather_data,  
 "forecast": forecast_data,  
 "timestamp": timestamp  
 }  

 try:  
 S3_CLIENT.put_object(  
 Bucket=AWS_BUCKET_NAME,  
 Key=file_name,  
 Body=json.dumps(data_to_save),  
 ContentType="application/json"  
 )  
 print(f"Дані для {city} збережено в S3.")  
 except Exception as e:  
 print(f"Помилка при збереженні в S3: {e}")  

@app.route('/weather', methods=['POST'])  
def get_weather():  
 """Отримує дані про погоду та прогноз для заданого міста."""  
 data = request.get_json()  
 city = data.get('city')  

 if not city:  
 return jsonify({"error": "Необхідно вказати назву міста"}), 400  

 try:  
 # Отримання поточної погоди  
 weather_url = f"http://api.openweathermap.org/data/2.5/weather"  
 weather_params = {  
 "q": city,  
 "appid": API_KEY,  
 "units": "imperial" # Змініть на "metric", якщо потрібно  
 }  
 weather_response = requests.get(weather_url, params=weather_params)  
 weather_response.raise_for_status()  
 weather_data = weather_response.json()  

 # Отримання даних прогнозу  
 forecast_url = f"http://api.openweathermap.org/data/2.5/forecast"  
 forecast_params = {  
 "q": city,  
 "appid": API_KEY,  
 "units": "imperial"  
 }  
 forecast_response = requests.get(forecast_url, params=forecast_params)  
 forecast_response.raise_for_status()  
 forecast_data = forecast_response.json()  

 # Зберігання даних в S3  
 save_to_s3(city, weather_data, forecast_data)  

 # Відправка відповіді на фронтенд  
 return jsonify({  
 "weather": weather_data,  
 "forecast": forecast_data  
 })  
 except requests.exceptions.RequestException as e:  
 return jsonify({"error": f"Не вдалося отримати дані про погоду: {str(e)}"}), 500  
 except Exception as e:  
 return jsonify({"error": f"Сталася помилка: {str(e)}"}), 500  

if __name__ == '__main__':  
 app.run(debug=True)
python backend/src/weather_dashboard.py

Тепер протестуйте його за допомогою Postman або вставивши випадкові дані.

pic

Фронтенд (React)

Основні компоненти

  • WeatherForm: Обробляє введення користувача.
  • WeatherDisplay: Відображає дані про погоду.

Приклад коду на React

import React, { useState } from "react";  

import "../App.css";  

function WeatherApp() {  
 const [city, setCity] = useState("");  
 const [weatherData, setWeatherData] = useState(null);  
 const [error, setError] = useState("");  

 const fetchWeatherData = async () => {  
 setError(""); // Очищаємо попередні помилки  
 setWeatherData(null); // Очищаємо попередні дані  

 try {  
 const response = await fetch("http://localhost:5000/weather", {  
 method: "POST",  
 headers: {  
 "Content-Type": "application/json",  
 },  
 body: JSON.stringify({ city }),  
 });  

 if (!response.ok) {  
 const errorData = await response.json();  
 throw new Error(errorData.error || "Помилка сервера");  
 }  

 const data = await response.json();  
 setWeatherData(data);  
 } catch (err) {  
 setError(err.message);  
 }  
 };  

 return (  
   <div>  
     <h1>Weather Dashboard</h1>  
     <WeatherForm setCity={setCity} fetchWeatherData={fetchWeatherData} />  
     <WeatherDisplay weatherData={weatherData} error={error} />  
   </div>  
 );  
}  

onChange={(e) => setCity(e.target.value)}  
 />  
 Get Weather  

 {error && 
Error: {error}
}       {weatherData && (    
Weather in the {city}
Temperature: {weatherData.weather.main.temp}°F
Feels Like: {weatherData.weather.main.feels_like}°F
Conditions: {weatherData.weather.weather[0].description}
Forecast:
    {weatherData.forecast.list.map((forecast, index) => (    
    Date: {forecast.dt_txt}, Temp: {forecast.main.temp}°F    
    ))}    
    )}        );   }      export default WeatherApp; ```  ``` Start the Frontend      npm start ```  ## Тестування  Щоб переконатися, що додаток працює без збоїв:  1.
Enter valid city names (e.g., “New York”, “London”).
2. Check that data is displayed correctly on the frontend.
3. Verify that weather data is stored in your S3 bucket.

![pic](https://drive.javascript.org.ua/cc7a4521fe1_Ek2biq8YAMb_48LeYXp9dw_png)

![pic](https://drive.javascript.org.ua/08da7fc20a1_16y3WpTfniY_gXGV_AXLkg_png)

## Висновок

Слідуючи цьому посібнику, ви створили повноцінну погодну панель, яка інтегрує API, хмарне зберігання та динамічний інтерфейс. Цей проект є чудовим способом вивчити Flask, React і AWS S3 в реальному застосуванні.

Не соромтеся розширювати цей додаток, додаючи такі функції, як автентифікація користувачів, розширена візуалізація даних або підтримка кількох мов.

Ви можете налаштувати та розширити цей проект, додаючи нові функції або інтегруючи додаткові сервіси. Успіхів у програмуванні!

**GitHub**: [https://github.com/HARSHALJETHWA19/Weather-Dashboard](https://github.com/HARSHALJETHWA19/Weather-Dashboard)

**Слідуйте за мною :**

**Linkedin:** [**https://www.linkedin.com/in/harshaljethwa/**](https://www.linkedin.com/in/harshaljethwa/)

**GitHub:** [**https://github.com/HARSHALJETHWA19/**](https://github.com/HARSHALJETHWA19/)

**Twitter:** [**https://twitter.com/harshaljethwaa**](https://twitter.com/harshaljethwaa)

**Дякую!!!**



Перекладено з: [Building a Weather Dashboard with Flask, React, and AWS S3: A Step-by-Step Guide](https://medium.com/cloud-native-daily/building-a-weather-dashboard-from-backend-to-frontend-32598a37d1ce)

Leave a Reply

Your email address will not be published. Required fields are marked *