Django + API Server

Jingi·2024년 4월 26일

Web

목록 보기
31/40
post-thumbnail

서울 날씨 데이터 확인

환경변수 설정

  • .env

    • 해당 파일에 api_key를 정의해준다
  • settings.py

    import os
    import environ
    
    env = environ.Env(DEBUG=(bool, True))
    environ.Env.read_env(
        env_file=os.path.join(BASE_DIR, '.env')
    )
    WEATHER_API_KEY = env('API_KEY')

A. 서울의 5일 치 예보 데이터 확인

  • API에 요청을 보내고 데이터 확인

    • DB에 저장하기 전 데이터를 확인하기 위한 과정

      api_key = settings.WEATHER_API_KEY
      
      # A. 서울의 5일 치 예보 데이터 확인
      @api_view(['GET'])
      
      def index(request):
          city_name = 'Seoul,KR'
      
          url = f'http://api.openweathermap.org/data/2.5/forecast?q={city_name}&appid={api_key}'
          response = requests.get(url).json()
          return JsonResponse(response)

B. 예보 데이터 중 원하는 데이터만 DB에 저장

  • dt_txt : 시간

  • temp : 온도

  • feels_like : 체감 온도

    # models.py
    class Weather(models.Model):
        dt_txt = models.DateTimeField()   # 관측 시간
        temp = models.FloatField()        # 온도(기본값: 켈빈온도)
        feels_like = models.FloatField()  # 체감온도(기본값: 켈빈온도)
    
  • 3가지 필드를 DB에 저장하기 위해 다음과 같이 Models.py

    # views.py
    def save_data(request):
        city_name = 'Seoul,KR'
    
        url = f'http://api.openweathermap.org/data/2.5/forecast?q={city_name}&appid={api_key}'
        response = requests.get(url).json()
    
        for li in response.get('list'):
            # 원하는 데이터 추출하기
            dt_txt = li.get('dt_txt')
            temp = li.get('main').get('temp')
            feels_like = li.get('main').get('feels_like')
    
            # 항상 확인부터!
            # print('dt_txt = ', dt_txt)
            # print('temp = ', temp)
            # print('feels_like = ', feels_like)
    
            save_data = {
                'dt_txt': dt_txt,
                'temp': temp,
                'feels_like': feels_like,
            }
    
            serializer = WeatherSerializer(data=save_data)
            # 유효성 검증
            if serializer.is_valid(raise_exception=True):
                # 유효하다면, 저장
                serializer.save()
    
        return JsonResponse({ "message": "save okay!" })
  • 받아온 데이터를 저장하기 위한 과정

    • key 값이 list인 데이터를 반복하며 확인
    • 시간은 UTC로 저장되어 있어, 코드 수정
    • 추출한 데이터를 Serializer에 삽입
    • 데이터 유효성 검증 후 저장

C. 저장된 전체 데이터 조회

  • ORM을 활용해 전체 데이터 확인
    # views.py
    @api_view(['GET'])
    def list_data(request):
        weathers = Weather.objects.all()
        serializers = WeatherSerializer(weathers, many=True)
        return Response(serializers.data)

D. 특정 조건의 데이터 확인하기 : 섭씨 30도가 넘는 시간대만 조회

  • 저장한 데이터 중 조건에 맞는 데이터만 반환

    • 전체 데이터를 반복하며 섭씨 30도가 넘는 데이터만 새로운 리스트로 만듬

    • 새로운 리스트를 Seraializer를 통해 사용자에게 반환

      @api_view(['GET'])
      def hot_weathers(request):
          # 단순한 방법
          # 1. 전체를 가져온다
          # weathers = Weather.objects.all()
          # # 2. 새로운 리스트에다가 조건에 맞는 데이터만 추가한다
          # hot_weathers = []
          # for weather in weathers:
          #     # 섭씨온도가 20도가 넘으면 hot_weathers 에 추가
          #     celsius = round(weather.temp - 273.15, 2)
          #     if celsius > 20:
          #         hot_weathers.append(weather)
      
          # # 3. 포장해서 반환다.
          # serializers = WeatherSerializer(hot_weathers, many=True)
          # return Response(serializers.data)
      
          # 권장 방식
          weathers = Weather.objects.filter(temp__gt=(20 + 273.15))
          serializers = WeatherSerializer(weathers, many=True)
          return Response(serializers.data)
profile
데이터 분석에서 백엔드까지...

0개의 댓글