我从存储在 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 获取天气数据,并尝试将其显示在网页上。
我希望天气数据(如温度和状况)能够以用户友好的格式显示在网页上。
在天气应用程序中显示 “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 路径的结构。
这应该有助于解决问题并允许您在网页上正确显示天气数据。