Django views KeyError on production

I have a small NewsAPI application that returns JSON data when I run it locally but after deploying it on Heroku I get a KeyError in the logs and a 500 on the webpage.

The log appears to show that the error is in the views:

2020-12-25T23:21:33.571005+00:00 app[web.1]: File "./evening_brew/news/views/api.py", line 114, in get
2020-12-25T23:21:33.571006+00:00 app[web.1]: news = self.requestNewsApi()
2020-12-25T23:21:33.571006+00:00 app[web.1]: File "./evening_brew/news/views/api.py", line 60, in requestNewsApi
2020-12-25T23:21:33.571006+00:00 app[web.1]: return self.extractDataFromNewsApi(responseData)
2020-12-25T23:21:33.571007+00:00 app[web.1]: File "./evening_brew/news/views/api.py", line 31, in extractDataFromNewsApi
2020-12-25T23:21:33.571007+00:00 app[web.1]: for posts in data["articles"]:
2020-12-25T23:21:33.571008+00:00 app[web.1]: KeyError: 'articles'

Here's the full code for the view that the log is referring to:

class NewsViewSet(MultipleSerializerMixin, viewsets.GenericViewSet):

    permission_classes = [AllowAny]

    def get_queryset(self):
        queryset = News.objects.all().order_by("-published_at")
        return queryset

    def extractDataFromNewsApi(self, data):
        articles = []
        for posts in data["articles"]:
            post = {}
            post["headline"] = posts["title"]
            post["link"] = posts["url"]
            post["snippet"] = posts["description"]
            post["content"] = posts["content"]
            post["image_url"] = posts["urlToImage"]
            post["published_at"] = posts["publishedAt"]
            post["source"] = "news"
            articles.append(post)
        return articles

    def requestNewsApi(self, query=False):
        headers = {"Authorization": "Basic "}
        if query:
            url = (
                settings.NEWS_API_URL
                + "everything?q=business+finance&pageSize=50&apiKey="
                + settings.NEWS_API_KEY
            )
            r = requests.get(url, headers=headers, params={"q": query})
        else:
            url = (
                settings.NEWS_API_URL
                + "everything?q=business&pageSize=50&apiKey="
                + settings.NEWS_API_KEY
            )
            r = requests.get(url, headers=headers)
        responseData = json.loads(r.text)
        return self.extractDataFromNewsApi(responseData)

    def storeInDb(self, articles, query=False):
        for article in articles:
            news = News(
                query=(query if query else "list"),
                request_date=datetime.date.today(),
                source=article["source"],
                headline=article["headline"],
                link=article["link"],
                snippet=article["snippet"],
                content=article["content"],
                image_url=article["image_url"],
                published_at=article["published_at"],
            )
            news.save()

    def getFromDb(self, query=None):
        news = News.objects.filter(
            query=(query if query else "list"), request_date=datetime.date.today()
        ).order_by("-published_at")
        return [
            {
                "headline": obj.headline,
                "link": obj.link,
                "image_url": obj.image_url,
                "snippet": obj.snippet,
                "content": obj.content,
                "published_at": obj.published_at,
                "source": obj.source,
            }
            for obj in news
        ]

    def list(self, request):
        query = request.query_params.get("query", None)
        news = self.getFromDb(query)
        if not news:
            if query:
                news = self.requestNewsApi(query)
                self.storeInDb(news, query)
            else:
                news = self.requestNewsApi()
                self.storeInDb(news)

        return Response(news, status=status.HTTP_200_OK)

Locally, when I go to localhost:8000/api/news I get the formatted JSON data and that data gets populated into the database automatically.

The extractDataFromNewsApi function works fine locally but seems to be throwing the KeyError on Heroku.

If there is an issue retrieving a key that isn't in the dictionary, why am not experiencing the same issue in my local dev?



from Recent Questions - Stack Overflow https://ift.tt/3hgJN6Z
https://ift.tt/eA8V8J

Comments

Popular posts from this blog

Spring Elasticsearch Operations

Network Error and Timeout on Authorize.net JS

Object oriented programming concepts (OOPs)