首页 > 解决方案 > 不在 API 中的数据的 Django GET 请求结果

问题描述

语境

我正在使用 django 通过表单获取用户输入。然后,此数据 city_name 用于调用天气数据的 API。

当给出实际城市名称时,请求工作正常。


阻挡者/障碍物

但是,这两种特定情况会导致以下错误。

  1. 城市名称无效
  2. 没有在表单中输入任何内容就点击了搜索按钮 在此处输入图像描述

我尝试使用一些条件逻辑无济于事。
任何帮助将不胜感激。

视图.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(索引.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>

标签: pythondjangopython-requests

解决方案


推荐阅读