django KeyError at (запрос) - PullRequest
       71

django KeyError at (запрос)

0 голосов
/ 29 сентября 2019

Я делаю программу, и у меня небольшая проблема.В настоящее время я разрабатываю веб-страницу с python django и запросами, и у меня есть ошибка, в которой упоминается, что Key Key Error в 'main', и вот мои коды

форма:

from django.forms import ModelForm, TextInput
from .models import City

class CityForm(ModelForm):
    class Meta:
        model = City
        fields = ['name']
        widgets = {'name' : TextInput(attrs={'class':'input', 'placeholder' :'City Name'})}

модели:

from django.db import models

class City(models.Model):
    name = models.CharField(max_length=25)

    def __str__(self):
        return self.name

    class Meta:
        verbose_name_plural = 'cities'

просмотров:

import requests
from django.shortcuts import render
from .models import City
from .forms import CityForm

def index(request):
    url = 'http://api.openweathermap.org/data/2.5/weather?q={}&units=metric&appid=212c1f52ec8c8bbf34933937a6885114'

    if request.method == 'POST':
        form = CityForm(request.POST)
        form.save()

    form = CityForm()

    cities = City.objects.all()

    weather_data = []

    for city in cities:

        r =  requests.get(url.format(city)).json()

        city_weather = {
            'city' : city.name,
            'temprature' : r['main']['temp'],
            'description' : r['weather'][0]['description'],
            'icon' : r['weather'][0]['icon'],
        }

        weather_data.append(city_weather)
    context = {'weather_data' : weather_data, 'form' : form}
    return render(request, 'weather_data/weather.html', context)

Я перепробовал все, что мог, но ничего не получилось, я стер "главную" часть и все остальное ... наконецничего не получалось.У меня есть сообщение об ошибке, подобное этому:

Environment:


Request Method: GET
Request URL: http://codefair-tripple-wrbdv.run.goorm.io/

Django Version: 2.1
Python Version: 3.7.4
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'weather_data']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']



Traceback:

File "/workspace/CODEFAIR_TRIPPLE/project/myvenv/lib/python3.7/site-packages/django/core/handlers/exception.py" in inner
  34.             response = get_response(request)

File "/workspace/CODEFAIR_TRIPPLE/project/myvenv/lib/python3.7/site-packages/django/core/handlers/base.py" in _get_response
  126.                 response = self.process_exception_by_middleware(e, request)

File "/workspace/CODEFAIR_TRIPPLE/project/myvenv/lib/python3.7/site-packages/django/core/handlers/base.py" in _get_response
  124.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/workspace/CODEFAIR_TRIPPLE/project/weather_data/views.py" in index
  25.             'temprature' : r['main']['temp'],

Exception Type: KeyError at /
Exception Value: 'main'

Пожалуйста, помогите мне!

1 Ответ

0 голосов
/ 29 сентября 2019

После просмотра API вам может понадобиться взглянуть на формат ответа API и обработать неудачные случаи.

Прежде всего, вам следуетобрабатывать в случае, если ваш сервер не может подключиться к конечной точке API, существует много ситуаций, которые могут привести к возникновению ошибок на сервере.Итак, попробуйте обернуть ваш requests.get внутри try ... except блока, например:

try:
    r =  requests.get(url.format(city)).json()
except requests.exceptions.RequestException:
    # Handle incase you're unable to get the response
    continue
else:
    # Handle the successful case

Во-вторых, обработчик для успешного запроса (внутри блока else):

...
else:
    # Only handle successful cases
    if r.get('cod', 0) != "200":
        continue

    # Handle the rest as it is

В конце концов,

    for city in cities:
        try:
            r =  requests.get(url.format(city)).json()
        except requests.exceptions.RequestException:
            # Handle request exceptions here
            continue
        else:
            if r.get('cod') != "200":
                # Ignore failed cases
                continue

            city_weather = {
                'city' : city.name,
                'temprature' : r['main']['temp'],
                'description' : r['weather'][0]['description'],
                'icon' : r['weather'][0]['icon'],
            }

            weather_data.append(city_weather)

    context = {'weather_data' : weather_data, 'form' : form}

Надеюсь, что это поможет!

Есть еще одна вещь, которую я просто хочу обсудить с вами о том, насколько свежими вы хотите для своих данных?Требуются ли данные в реальном времени?Потому что это может поглотить большую часть вашей учетной записи, чтобы запросить API погоды.Если это не так, я думаю, вы могли бы использовать django cache для кэширования ответа, чтобы вам не приходилось вызывать его слишком часто (я думаю, что погода не будет меняться так быстро)

...