.env
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')
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)
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!" })
받아온 데이터를 저장하기 위한 과정
# views.py
@api_view(['GET'])
def list_data(request):
weathers = Weather.objects.all()
serializers = WeatherSerializer(weathers, many=True)
return Response(serializers.data)저장한 데이터 중 조건에 맞는 데이터만 반환
전체 데이터를 반복하며 섭씨 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)