我正在使用 Flask 制作一个 Python 天气 webb 应用程序,它从 API 密钥收集数据,但我遇到了问题

问题描述 投票:0回答:1

我从存储在 venv 文件中的 API 密钥获取数据。我可以请求显示该日期的天气,但它显示为

”温度:N/A°C / N/A°F

条件:不适用“

当我尝试通过终端使用“flask run”运行应用程序时,它会从 API 获取数据,但通过包含嵌套信息的 JSON 对象获取数据。问题是以用户友好的格式显示数据。

这是三个文件的代码,python文件,weather.html文件和index.html文件。

from flask import Flask, render_template, request
import os
from dotenv import load_dotenv
import requests

# Load environment variables from .env file
load_dotenv()

app = Flask(__name__)

@app.route('/')
def index():
    api_key = os.getenv('WEATHER_API_KEY')  # Ensure this is not a real key
    return render_template('index.html', api_key=api_key)

@app.route('/weather_app', methods=['POST'])
def weather_app():
    date = request.form.get('date')
    api_key = os.getenv('WEATHER_API_KEY')  # Ensure this is not a real key

    api_url = "https://api.weatherapi.com/v1/history.json"
    params = {
        'key': api_key,
        'q': "Stockholm",
        'dt': date
    }

    response = requests.get(api_url, params=params)

    if response.status_code == 200:
        weather_data = response.json()
        
        location = weather_data.get('location', {})
        current = weather_data.get('current', {})
        
        location_name = location.get('name', 'Unknown')
        temp_c = current.get('temp_c', 'N/A')
        temp_f = current.get('temp_f', 'N/A')
        condition_text = current.get('condition', {}).get('text', 'N/A')
        condition_icon = current.get('condition', {}).get('icon', '')
        
        formatted_data = {
            'location_name': location_name,
            'temp_c': temp_c,
            'temp_f': temp_f,
            'condition_text': condition_text,
            'condition_icon': condition_icon,
            'date': date
        }

        return render_template('weather.html', weather=formatted_data)
    else:
        return f"Error: Unable to fetch weather data (Status Code: {response.status_code})"

if __name__ == '__main__':
    app.run(debug=True)
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Weather Data</title>
</head>
<body>
    <h1>Weather Data for {{ weather.date }}</h1>
    <p>Location: {{ weather.location_name }}</p>
    <p>Temperature: {{ weather.temp_c }}°C / {{ weather.temp_f }}°F</p>
    <p>Condition: {{ weather.condition_text }}</p>
    <img src="https://cdn.weatherapi.com/weather/64x64/{{ weather.condition_icon }}" alt="Weather Icon">
    <a href="/">Go back</a>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Weather App</title>
</head>
<body>
    <h1>Weather App</h1>
    <form action="/weather_app" method="POST">
        <label for="date">Enter a date (YYYY-MM-DD):</label>
        <input type="text" id="date" name="date" required>
        <button type="submit">Get Weather</button>
    </form>
    <p>Weather API Key: {{ api_key }}</p>  <!-- Ensure API key is a placeholder -->
</body>
</html>

如果我解释得不好或遗漏了任何信息,请耐心等待。

我使用 Flask 从 API 获取天气数据,并尝试将其显示在网页上。

我希望天气数据(如温度和状况)能够以用户友好的格式显示在网页上。

python json api flask
1个回答
0
投票

在天气应用程序中显示 “N/A” 值的问题可能是由于错误地检索天气数据或使用错误的密钥从 API 响应访问 JSON 对象造成的。

考虑到您正在尝试获取历史天气数据,您使用的键(当前、位置等)可能与 API 响应的结构不匹配。对于历史数据,API 响应结构可能有所不同。

以下是排除故障并解决此问题的方法:

1。检查 JSON 结构: 打印出来自 API 的 JSON 响应,以了解其结构并确保您正在访问正确的密钥。您可以通过在发出请求后添加一个简单的 print(response.json()) 来完成此操作。

2。正确访问嵌套数据: 根据您使用的 API,历史天气数据可能嵌套在不同的键下。例如,它可能低于预测或历史。

这是一个可能的更正:

@app.route('/weather_app', methods=['POST'])
def weather_app():
    date = request.form.get('date')
    api_key = os.getenv('WEATHER_API_KEY')

    api_url = "https://api.weatherapi.com/v1/history.json"
    params = {
        'key': api_key,
        'q': "Stockholm",
        'dt': date
    }

    response = requests.get(api_url, params=params)

    if response.status_code == 200:
        weather_data = response.json()
        print(weather_data)  # Debugging: Print the entire response

        # The historical data might be under the 'forecast' key
        forecast = weather_data.get('forecast', {})
        forecastday = forecast.get('forecastday', [{}])[0]  # Assuming you want the first day
        
        # Check if the structure is different
        day = forecastday.get('day', {})
        
        location_name = weather_data.get('location', {}).get('name', 'Unknown')
        temp_c = day.get('avgtemp_c', 'N/A')
        temp_f = day.get('avgtemp_f', 'N/A')
        condition_text = day.get('condition', {}).get('text', 'N/A')
        condition_icon = day.get('condition', {}).get('icon', '')

        formatted_data = {
            'location_name': location_name,
            'temp_c': temp_c,
            'temp_f': temp_f,
            'condition_text': condition_text,
            'condition_icon': condition_icon,
            'date': date
        }

        return render_template('weather.html', weather=formatted_data)
    else:
        return f"Error: Unable to fetch weather data (Status Code: {response.status_code})"

3. HTML 模板更新: 确保 HTML 模板正确访问传递的数据。您编写的方式看起来不错,但请确保图像的 API URL 正确。您可能需要检查 condition_icon 路径的结构。

这应该有助于解决问题并允许您在网页上正确显示天气数据。

© www.soinside.com 2019 - 2024. All rights reserved.