#python #django #python-requests
Вопрос:
Контекст
Я использую django для ввода данных пользователем через форму. Эти данные, city_name, затем используются для вызова API для данных о погоде.
Запрос работает нормально, когда указано фактическое название города.
Блокиратор/Препятствия
Однако эти 2 конкретных случая приводят к следующей ошибке.
Я пытался использовать некоторую условную логику безрезультатно.
любая помощь будет очень признательна.
Views.py
from django.shortcuts import render
import requests
def index(request):
if 'city' in request.GET:
city = request.GET['city']
# Query API with user input
payload = {'q': request.GET['city'], 'appid': 'API_KEY'}
response = requests.get('http://api.openweathermap.org/data/2.5/weather', params=payload)
# Parse json output for key value pairs
e = response.json()
context = {
'city_name': e['name'],
'weather':e['weather'][0]['main'],
'description' : e['weather'][0]['description'],
'temp' : e['main']['temp'],
'pressure':e['main']['pressure'],
'humidity':e['main']['humidity'],
'visibility':e['visibility'],
'wind_speed':e['wind']['speed'],
'wind_deg':e['wind']['deg']
}
# successfull response code
search_was_successful = (response.status_code == 200) # 200 = SUCCESS
context['success'] = search_was_successful
return render(request, 'index.html', {'context': context})
else:
context = None
return render(request, 'index.html', context)
HTML(index.html)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>WeatherApp</title>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/5.0.0-alpha1/css/bootstrap.min.css">
</head>
<body>
<div align="center">
<h1>Weather in your city</h1>
<form action="" method="get">
<input type="text" id="city" name="city" placeholder="Enter a city">
<input type="submit" name="send" value="Search">
</form>
{% if context %}
{% if context.success %}
<p>
<h3>The weather in {{context.city_name}} is:</h3>
<div>Weather: {{context.weather}}</div>
<div>Weather description: {{context.description}}</div>
<div>Temperature: {{context.temp}} <sup>o</sup>C</div>
<div>Pressure: {{context.pressure}} hPa</div>
<div>Humidity: {{context.humidity}} %</div>
<div>Visibility: {{context.visibility}} m</div>
<div>Wind Speed: {{context.wind_speed}} meter/sec</div>
<div>Wind Degrees: {{context.wind_deg}} <sup>o</sup></div>
<div>Conn: {{context.success}} <sup>o</sup></div>
</p>
{% else %}
<p><em>This doesn't work</em></p>
{% endif %}
{% endif %}
</div>
</body>
</html>
Комментарии:
1. Это не ответ на ваш вопрос, но я рекомендую вам проверить, что запрос API был успешным, прежде чем пытаться получить доступ к данным ответа. Практически это означает, что проверка status_code должна выполняться до создания контекстного словаря. В случае, если код состояния API не равен 200, вы должны справиться с этим, предполагая, что ключ «имя» не будет доступен в переменной
e
2. Измениться
e['name']
наcity
?3. В ответе Json есть словарь, где ключ = «имя» и значение = «название города». Это не проблема, так как она отлично работает, если указано правильное название города.