Django ПОЛУЧАЕТ результат запроса данных, не содержащихся в API

#python #django #python-requests

Вопрос:

Контекст

Я использую django для ввода данных пользователем через форму. Эти данные, city_name, затем используются для вызова API для данных о погоде.

Запрос работает нормально, когда указано фактическое название города.

Блокиратор/Препятствия

Однако эти 2 конкретных случая приводят к следующей ошибке.

  1. Неверное название города
  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 есть словарь, где ключ = «имя» и значение = «название города». Это не проблема, так как она отлично работает, если указано правильное название города.