Как использовать django кеш с REST Framework? - PullRequest
1 голос
/ 10 января 2020

Я довольно новичок в Django и пытаюсь получить рабочий бэкэнд. Пока что мой бэкэнд работает нормально, но я не знаю, как ответить пользовательскими данными:

Что у меня есть:

  • Angular Интерфейс

  • Django (REST) ​​Бэкэнд

  • Рабочий кэш

Что я хочу достичь:

Я хочу вызвать конечную точку (скажем, бэкэнд / погода). Когда я вызываю эту конечную точку, я хочу проверить в кеше значение погоды. Если он есть, я хочу отправить его клиенту. Если его нет, я хочу сделать вызов API, сохранить полученное значение в моем кэше и отправить его клиенту. Как я могу это сделать. Вот что у меня есть:

views.py

from rest_framework import viewsets

from .models import Weather
from .serializers import WeatherSerializer

from django.core.cache import cache
from urllib.request import urlopen
import json


class WeatherView(APIView):

    def get(self):
        if(cache.get('temp') == None):
            url = 'https://api.openweathermap.org/data/2.5/forecast?q=' + '...';
            serialized_data = urlopen(url).read()
            data = json.loads(serialized_data)
            print(data)

            cache.set('weatherdata', data, 3600)
        else:
            data = cache.get('weatherdata')

        serializer_class = WeatherSerializer(data)

        responseJSON = JSONRenderer().render(serializer_class.data)

        return Response(responseJSON)

serializers.py

from rest_framework import serializers
from .models import Weather


class WeatherSerializer(serializers.Serializer):

    temp = serializers.DecimalField(max_digits=4, decimal_places=2)
    iconName = serializers.CharField()

urls.py

from django.urls import path, include
from . import views
from rest_framework import routers
from django.conf import settings
from django.conf.urls.static import static

router = routers.DefaultRouter()

urlpatterns = [
    path('', include(router.urls)),
    path('weather', views.WeatherView)
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Я получаю данные из API. Мои настройки и получение кеша тоже работают. Но я не знаю, как ответить пользовательскими данными. Я получаю следующую ошибку при вызове backend / weather:

TypeError at /weather
__init__() takes 1 positional argument but 2 were given
Request Method: GET
Request URL:    http://127.0.0.1:8000/weather
Django Version: 2.2.7
Exception Type: TypeError
Exception Value:    
__init__() takes 1 positional argument but 2 were given

Заранее спасибо!

...