본문 바로가기

Back-end/Django

Django에서 날씨 앱 만드는 방법

소개

이 기사에서는 다양한 도시의 현재 날씨를 표시하는 간단한 Django 앱을 빌드 할 것입니다. 현재 날씨 데이터를 가져 오기 위해 Open Weather Map API를 사용합니다 .

우리는 데이터베이스로 작업하고 양식을 만들 것이므로 여기에 사용 된 개념은 더 복잡한 프로젝트에 적용 할 수 있습니다.

이 기사의 코드는 Python 3 및 Django 2.0으로 작성되었으므로이 튜토리얼을 따르려면 둘 다에 어느 정도 익숙해야합니다.

작업이 완료되면 앱이 어떻게 표시 될 것입니다.

이 기사의 모든 코드는 GitHub  있습니다 .

설치

Django를 설치하는 것은 다른 Python 라이브러리를 설치하는 것과 같습니다. 가상 환경을 시작하고 실행 pip하여 Django를 설치하거나, ​​내가하는 일을 수행하고 프로젝트 디렉토리를 만들고을 실행 pipenv한 다음 pipenv셸 을 활성화 할 수 있습니다. 두 방법 모두 작동하지만이 기사에서는 pipenv.

  • pipenv install django

그러면 최신 버전의 Django가 설치됩니다. 이 글을 쓰는 시점에서 Django는 2.0.4 버전입니다.

Django를 설치했으면 아직 설치하지 않은 경우이 프로젝트의 디렉토리를 만들고 탐색합니다. 일단 거기에서 startprojectDjango가 프로젝트를 생성하기 위해 제공 하는 명령을 실행할 수 있습니다 .

  • django-admin startproject the_weather

Django는 디렉토리에 몇 개의 새 파일을 생성해야합니다.

개발 서버를 시작해 보겠습니다. 이를 수행하려면 새 디렉토리로 이동 하여 터미널 manage.py에서 runserver명령 을 실행하는 데 사용 하십시오.

  • cd the_weather
  • python manage.py runserver

터미널을 보면 앱의 URL이 표시되어야합니다. 기본적으로 127.0.0.1:8000.

브라우저를 열고 해당 URL로 이동하십시오.

이것이 보이면 Django를 올바르게 설정 한 것입니다. 우리가 아직 코드를 수정하지 않았기 때문에 확실히보아야합니다.

관리 대시 보드

다음으로 Django가 제공하는 관리 대시 보드를 살펴 보겠습니다. 이를 위해 먼저 데이터베이스를 마이그레이션해야합니다. 즉, Django가 기본 앱에 필요한 미리 정의 된 테이블을 생성합니다. 이렇게하려면 migrate명령을 실행하십시오 . CTRL+C다음 을 사용하여 서버를 중지 한 후 다음을 실행하십시오.

  • python manage.py migrate

이 명령을 실행함으로써 Django는 설정의 기본 데이터베이스 인 SQLite 데이터베이스를 만들었으며 해당 데이터베이스에 여러 테이블을 추가했습니다.  db 를 보면 데이터베이스가 생성되었는지 알 수 있습니다 . 프로젝트 디렉토리에있는 sqlite3 파일.

Django가 제공하는 테이블 중 하나는 앱에 사용자를 저장하는 데 사용되는 사용자 테이블입니다. 우리가 구축하는 앱에는 사용자가 필요하지 않지만 관리자가 있으면 관리자 대시 보드에 액세스 할 수 있습니다.

관리자를 생성하기 위해 createsuperuser 명령을 실행합니다.

  • python manage.py createsuperuser

관리자의 사용자 이름, 이메일 주소 및 비밀번호를 제공하여 지침을 따르십시오. 이 작업을 마치면 서버를 다시 시작하고 관리 대시 보드로 이동해야합니다.

  • python manage.py runserver

그런 다음로 이동합니다 127.0.0.1:8000/admin.

이 페이지로 이동할 수있는 이유는 admin이 설정되어 있기 때문입니다 urls.py(축하 페이지를 볼 수있는 이유는 Django가 자신의 URL을 추가 할 때까지 제공하기 때문입니다).

방금 만든 사용자 이름과 비밀번호로 로그인하면 Django Admin Dashboard가 표시됩니다.

그룹과 사용자는 Django가 액세스 할 수있는 두 가지 모델을 나타냅니다. 모델은 데이터베이스에있는 테이블의 코드 표현 일뿐입니다. Django가 더 많은 테이블을 생성했지만 나머지 테이블에 직접 액세스 할 필요가 없으므로 모델이 생성되지 않았습니다.

를 클릭 'user'하면 사용자 테이블에 대한 자세한 내용이 표시되고 생성 한 사용자가 표시됩니다. 대시 보드에서 다른 링크를 클릭하여 탐색하여 무엇이 있는지 확인하는 것이 좋습니다. 사용자를 삭제하지 않도록주의 createsuperuser하십시오. 그렇지 않으면 다시 실행 해야합니다.

지금은 관리자 대시 보드를 떠나 코드로 이동하겠습니다. 프로젝트 내에서 날씨 앱용 앱을 만들어야합니다.

 

앱 만들기

Django에서는 앱을 사용하여 프로젝트의 기능을 분리 할 수 ​​있습니다. 일반적으로 앱을 전체 프로젝트라고 부르기 때문에 앱이 혼란스러운 이름이라고 생각하지만 Django의 경우 앱은 프로젝트의 특정 기능을 나타냅니다. 예를 들어 settings.py 파일을 보면 INSTALLED_APPS 목록이 표시됩니다.

설치된 앱 중 첫 번째 인 django.contrib.admin은 방금 사용한 것입니다. 모든 관리자 기능 만 처리합니다. 기본적으로 프로젝트의 또 다른 앱은 관리자 대시 보드에 로그인 할 수있는 인증과 같은 것입니다.

우리의 경우 날씨 표시와 관련된 모든 것을 처리 할 새 앱을 만들어야합니다. 해당 앱을 만들려면 다음을 사용하여 서버를 중지 CTRL+C하고 다음을 실행하세요.

python manage.py startapp weather

를 실행함으로써 startappDjango는 프로젝트에 새 디렉토리와 더 많은 파일을 추가했습니다.

생성 된 최신 파일을 사용하여 앱 디렉토리에 urls.py라는 새 파일을 만듭니다.

from django.urls import path

urlpatterns = [
]

 

이 파일은 urls.py우리 the_weather디렉토리 의 파일과 유사합니다 . 차이점은이 urls.py파일에는 앱 자체와 관련된 모든 URL  포함되어 있다는 것입니다.

아직 URL을 지정하지는 않았지만 앱을 인식하고 앱에 특정한 URL을 앱 urls.py파일로 라우팅하도록 프로젝트를 설정할 수 있습니다 .

먼저 INSTALLED_APPS목록으로 이동 하여이 앱을 목록에 추가합니다.

the_weather / the_weather / settings.py
...

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'weather',
]

...

이를 통해 Django는 프로젝트에서 날씨 앱을 사용하고 싶다는 것을 알 수 있습니다. 이렇게함으로써 Django는 마이그레이션과 URL을 찾을 위치를 알게됩니다.

다음으로, urls.py앱 urls.py파일 을 가리 키도록 원본을 수정해야 합니다. 이를 위해 관리 대시 보드의 기존 경로 아래에 줄을 추가합니다. 또한 include앱 urls.py파일을 가리킬 수 있도록 가져와야 합니다.

the_weather / the_weather / urls.py

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('weather.urls')),
]

빈 문자열은 앱의 진입 점에 엔드 포인트를 사용하지 않음을 의미합니다. 대신 앱이 특정 엔드 포인트를 처리하도록 할 것입니다. 경로 ( 'weather /',…)와 같은 것을 입력 할 수 있는데, 이는 127.0.0.1:8000/weather/날씨 앱과 관련된 모든 것을 가져 오려면 입력해야한다는 것을 의미 합니다. 그러나 우리의 프로젝트는 간단하기 때문에 여기서는 그렇게하지 않을 것입니다.

템플릿 및보기 추가

이제 우리가 할 첫 번째 흥미로운 일입니다. 프로젝트에 템플릿을 추가해야합니다.

Django의 템플릿은 템플릿을 동적으로 만드는 추가 구문을 허용하는 HTML 파일입니다. 무엇보다도 변수, if문, 루프 추가와 같은 작업을 수행 할 수 있습니다 .

HTML 파일이 있지만 시작하기에 충분합니다.

이 파일을 넣을 템플릿 디렉토리를 만들 것입니다.

  • cd weather
  • mkdir templates && cd templates
  • mkdir weather

또한 앱과 동일한 이름으로 다른 디렉터리를 만들었습니다. Django는 우리가 가지고있는 다양한 앱의 모든 템플릿 디렉토리를 결합하기 때문에 이렇게했습니다. 파일 이름이 중복되는 것을 방지하기 위해 앱 이름을 사용하여 중복을 방지 할 수 있습니다.

날씨 디렉토리 안에 index.html. 이것이 우리의 메인 템플릿이 될 것입니다. 템플릿에 사용할 HTML은 다음과 같습니다.

the_weather / weather / templates / weather / index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>What's the weather like?</title>
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bulma/0.6.2/css/bulma.css" />
</head>
<body>
    <section class="hero is-primary">
        <div class="hero-body">
            <div class="container">
                <h1 class="title">
                    What's the weather like?
                </h1>
            </div>
        </div>
    </section>
    <section class="section">
        <div class="container">
            <div class="columns">
                <div class="column is-offset-4 is-4">
                    <form method="POST">
                        <div class="field has-addons">
                            <div class="control is-expanded">
                                <input class="input" type="text" placeholder="City Name">
                            </div>
                            <div class="control">
                                <button class="button is-info">
                                    Add City
                                </button>
                            </div>
                        </div>
                    </form>
                </div>
            </div>
        </div>
    </section>
    <section class="section">
        <div class="container">
            <div class="columns">
                <div class="column is-offset-4 is-4">
                    <div class="box">
                        <article class="media">
                            <div class="media-left">
                                <figure class="image is-50x50">
                                    <img src="http://openweathermap.org/img/w/10d.png" alt="Image">
                                </figure>
                            </div>
                            <div class="media-content">
                                <div class="content">
                                    <p>
                                        <span class="title">Las Vegas</span>
                                        <br>
                                        <span class="subtitle">29° F</span>
                                        <br> thunderstorm with heavy rain
                                    </p>
                                </div>
                            </div>
                        </article>
                    </div>
                </div>
            </div>
        </div>
    </section>
    <footer class="footer">
    </footer>
</body>
</html>

이제 템플릿을 만들었으므로 앱에서 실제로 볼 수 있도록보기와 URL 조합을 만들어 보겠습니다.

Django의 뷰는 함수 또는 클래스입니다. 우리의 경우 간단한 뷰를 생성하고 있기 때문에 함수를 생성 할 것입니다. 이 기능을 다음에 추가하십시오 views.py.

the_weather / weather / views.py

from django.shortcuts import render

def index(request):
    return render(request, 'weather/index.html') #returns the index.html template

 index가 루트 URL 인 앱의 색인에 있기 때문에 뷰 이름을 지정합니다 . 템플릿을 렌더링하려면 렌더링 기능에 필요한 요청과 렌더링하려는 템플릿 파일의 이름 (이 경우)을 반환 weather/index.html합니다.

이 뷰에 요청을 보낼 URL을 추가해 보겠습니다. 에서 URL을 . 평은 응용 프로그램에 대한 업데이트 urlpatterns목록을.

the_weather / weather / urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('', views.index),  #the path for our index view
]

이를 통해 방금 생성 한 뷰를 참조 할 수 있습니다.

Django는 엔드 포인트가없는 모든 URL을 매칭하여 우리가 만든 뷰 함수로 라우팅합니다.

프로젝트 루트로 돌아가서 서버를 시작한 다음 127.0.0.1:8000다시 이동 하십시오.

  • python manage.py runserver

지금 우리가 보는 것은 index.html파일 에있는 HTML의 결과입니다 . 라스 베이거스의 도시와 날씨를 추가하기위한 입력이 표시됩니다. 그러나 양식이 작동하지 않고 날씨는 자리 표시 자일 뿐이지 만이 앱에 대한 양식을 만들 것이므로 걱정하지 마십시오.

 

날씨 API 사용

지금하고 싶은 것은 Open Weather Map API에 가입하는 것입니다 . 이를 통해 앱에 추가 한 모든 도시의 실시간 날씨를 확인할 수 있습니다.

사이트로 이동하여 계정을 만든 다음 대시 보드의 API 키로 이동합니다. 이름을 입력하고 새 API 키를 생성하십시오. 이 키를 사용하면 API를 사용하여 날씨를 알 수 있습니다.

 

 

우리가 사용할 하나의 엔드 포인트는 아래에 있으므로 API 키로 다음 URL을 수정하고 브라우저에서 URL로 이동하여 반환되는 데이터를 볼 수 있습니다. API 키가 활성화 되려면 몇 분 정도 걸릴 수 있으므로 처음에 작동하지 않으면 몇 분 후에 다시 시도하십시오.

http://api.openweathermap.org/data/2.5/weather?q=las%20vegas&units=imperial&appid=YOUR_APP_KEY

이를 통해 데이터를 앱으로 가져 오는 요청을 추가해 보겠습니다.

먼저 앱 내에서 API를 호출 할 수 있도록 요청을 설치해야합니다.

  • pipenv install requests

우리가 가지고있는 URL로 요청을 보내도록 인덱스 뷰를 업데이트합시다.

the_weather / weather / views.py

from django.shortcuts import render
import requests

def index(request):
    url = 'http://api.openweathermap.org/data/2.5/weather?q={}&units=imperial&appid=YOUR_APP_KEY'
    city = 'Las Vegas'
    city_weather = requests.get(url.format(city)).json() #request the API data and convert the JSON to Python data types

    return render(request, 'weather/index.html') #returns the index.html template

이 세 줄로 요청을 보낼 URL을 추가합니다. 사용자가 자신의 도시를 추가 할 수 있도록 허용 할 때 도시의 일부를 자리 표시 자로 만듭니다.

지금은 도시를 Las Vegas로 설정하지만 나중에 데이터베이스에서 도시로 설정합니다.

마지막으로 도시를 사용하여 URL에 요청을 보내고 해당 도시의 JSON 표현을 가져옵니다. 이를 콘솔에 인쇄하면 주소 표시 줄에 URL을 입력 할 때 본 것과 동일한 데이터를 볼 수 있습니다.

서버를 다시 시작하고 페이지를 다시로드하면 데이터가 콘솔에 인쇄되는 것을 볼 수 있습니다.

템플릿에 데이터 표시

다음으로 데이터를 사용자에게 표시 할 수 있도록 템플릿에 전달해야합니다.

필요한 모든 데이터를 보관할 사전을 만들어 보겠습니다. 반환 된 데이터 중 임시, 설명 및 아이콘이 필요합니다.

the_weather / weather / views.py

def index(request):
    ...
    weather = {
        'city' : city,
        'temperature' : city_weather['main']['temp'],
        'description' : city_weather['weather'][0]['description'],
        'icon' : city_weather['weather'][0]['icon']
    }

    return render(request, 'weather/index.html') #returns the index.html template

이제 원하는 모든 정보를 얻었으므로 템플릿에 전달할 수 있습니다. 템플릿에 전달하기 위해 context라는 변수를 생성합니다. 이것은 템플릿 내에서 값을 사용할 수있게 해주는 사전이 될 것입니다.

the_weather / weather / views.py

def index(request):
    ...
    context = {'weather' : weather}
    return render(request, 'weather/index.html', context) #returns the index.html template

그런 다음 렌더링에서 컨텍스트를 세 번째 인수로 추가합니다.

컨텍스트 내부에 날씨 데이터가 추가되었으므로 템플릿으로 이동하여 데이터를 추가해 보겠습니다.

템플릿 내에서해야 할 일은 내가 입력 한 값 대신 변수를 사용하도록 HTML을 수정하는 것입니다. 변수는 {{}} 태그를 사용하고 컨텍스트 사전 내부의 모든 것을 참조합니다.

Django는 사전 키를 변환하므로 점 표기법을 통해서만 액세스 할 수 있습니다. 예를 들어 weather.city는 도시 이름을 제공합니다. 우리는 weather['city']파이썬 에서처럼 사용하지 않습니다 .

상자 div를 찾아 다음과 같이 업데이트합니다.

the_weather / weather / templates / weather / index.html

<div class="box">
    <article class="media">
        <div class="media-left">
            <figure class="image is-50x50">
                <img src="http://openweathermap.org/img/w/{{ weather.icon }}.png" alt="Image">
            </figure>
        </div>
        <div class="media-content">
            <div class="content">
                <p>
                    <span class="title">{{ weather.city }}</span>
                    <br>
                    <span class="subtitle">{{ weather.temperature }}° F</span>
                    <br> {{ weather.description }}
                </p>
            </div>
        </div>
    </article>
</div>

모든 변수가 교체되었으므로 이제 우리 도시의 현재 날씨를 볼 수 있습니다.

이제 우리는 한 도시의 날씨를 볼 수 있지만 도시를 하드 코딩해야했습니다. 지금하고 싶은 것은 데이터베이스에서 가져 와서 데이터베이스에있는 도시를 표시하는 것입니다.

이를 위해 데이터베이스에 날씨를 알고 싶은 도시를 저장할 테이블을 생성합니다. 이를위한 모델을 만들 것입니다.

models.py날씨 앱  파일로 이동 하여 다음을 추가하십시오.

the_weather / weather / models.py

from django.db import models

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

    def _str_(self): #show the actual city name on the dashboard
        return self.name

    class Meta: #show the plural of city as cities instead of citys
        verbose_name_plural = 'cities'

그러면 데이터베이스에 도시 이름 인 name이라는 열이있는 테이블이 생성됩니다. 이 도시는 charfield문자열 일뿐입니다.

데이터베이스에서 이러한 변경 사항을 가져 오려면 데이터베이스 makemigrations를 업데이트하는 코드를 생성하고 이러한 변경 사항을 적용하기 위해 마이그레이션해야합니다. 이제 그렇게합시다.

  • python manage.py makemigrations
  • python manage.py migrate

관리자 대시 보드에서이 모델을 볼 수있는 위치로 이동해야합니다. 그렇게하려면 admin.py파일 에 등록해야 합니다.

the_weather / weather / admin.py

from django.contrib import admin
from .models import City

admin.site.register(City)

관리 대시 보드에 도시가 옵션으로 표시됩니다.

그런 다음 관리 대시 보드로 이동하여 도시를 추가 할 수 있습니다. 저는 런던, 도쿄, 라스베가스의 세 가지부터 시작하겠습니다.

데이터베이스의 항목을 사용하여 뷰에서 이러한 항목을 쿼리해야합니다. 도시 모델을 가져온 다음 모든 개체에 대해 해당 모델을 쿼리하여 시작합니다.

the_weather / weather / views.py

from django.shortcuts import render
import requests
from .models import City
the_weather/weather/views.py
...
def index(request):
    url = 'http://api.openweathermap.org/data/2.5/weather?q={}&units=imperial&appid=YOUR_APP_KEY'
    cities = City.objects.all() #return all the cities in the database
    ...

도시 목록이 있으므로 도시를 반복하고 각 도시의 날씨를 가져 와서 결국 템플릿에 전달할 목록에 추가하려고합니다.

이것은 우리가 첫 번째 경우에 한 일의 변형 일뿐입니다. 다른 차이점은 각 사전을 반복해서 목록에 추가한다는 것입니다. 루프의 도시 변수를 위해 원래 도시 변수를 제거합니다.

the_weather / weather / views.py

def index(request):
    ...
    weather_data = []

    for city in cities:

        city_weather = requests.get(url.format(city)).json() #request the API data and convert the JSON to Python data types

        weather = {
            'city' : city,
            'temperature' : city_weather['main']['temp'],
            'description' : city_weather['weather'][0]['description'],
            'icon' : city_weather['weather'][0]['icon']
        }

        weather_data.append(weather) #add the data for the current city into our list

    context = {'weather_data' : weather_data}
    ...

이제 단일 사전 대신이 목록을 전달하도록 컨텍스트를 업데이트하겠습니다.

the_weather / weather / views.py

...
context = {'weather_data' : weather_data}
...

다음으로 템플릿 내부에서이 목록을 반복하고 목록의 각 도시에 대한 HTML을 생성해야합니다. 이를 for위해 도시에 대한 단일 상자를 생성하는 HTML 주위  루프를 배치 할 수 있습니다 .

the_weather / weather / index.html

<div class="column is-offset-4 is-4">
    {% for weather in weather_data %}
    <div class="box">
        <article class="media">
            <div class="media-left">
                <figure class="image is-50x50">
                    <img src="http://openweathermap.org/img/w/{{ weather.icon }}.png" alt="Image">
                </figure>
            </div>
            <div class="media-content">
                <div class="content">
                    <p>
                        <span class="title">{{ weather.city }}</span>
                        <br>
                        <span class="subtitle">{{ weather.temperature }}° F</span>
                        <br> {{ weather.description }}
                    </p>
                </div>
            </div>
        </article>
    </div>
    {% endfor %}
</div>

이제 데이터베이스에있는 모든 도시의 데이터를 볼 수 있습니다.

양식 만들기

마지막으로 원하는 것은 사용자가 양식에 도시를 직접 추가 할 수 있도록하는 것입니다.

그러려면 양식을 만들어야합니다. 양식을 직접 만들 수 있지만 양식은 모델과 정확히 동일한 필드를 가지므로 ModelForm.

라는 새 파일을 만듭니다 forms.py.

the_weather / weather / forms.py

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'}),
        } #updates the input class to have the correct Bulma class and placeholder

양식을 보려면보기에서 양식을 만들고 템플릿에 전달해야합니다.

이를 위해 색인 비디오를 업데이트하여 양식을 작성하겠습니다. 더 이상 필요하지 않으므로 이전 도시 변수를 동시에 교체합니다. 또한 양식이 템플릿에 전달되도록 컨텍스트를 업데이트해야합니다.

the_weather / weather / views.py

def index(request):
    ...
    form = CityForm()

    weather_data = []
    ...
    context = {'weather_data' : weather_data, 'form' : form}

이제 템플릿에서 양식 섹션을 업데이트하여 뷰의 양식을 사용하고 csrf_tokenDjango의 POST 요청에 필요한를 사용합니다.

<form method="POST">
    {% csrf_token %}
    <div class="field has-addons">
        <div class="control is-expanded">
            {{ form.name }}
        </div>
        <div class="control">
            <button class="button is-info">
                Add City
            </button>
        </div>
    </div>
</form>

HTML의 양식이 작동하면 이제 양식 데이터가 들어오는대로 처리해야합니다.이를 if위해 POST 요청에 대한 블록 검사를 생성합니다 . 날씨 데이터 수집을 시작하기 전에 요청 유형에 대한 검사를 추가해야 추가 한 도시에 대한 데이터를 즉시 얻을 수 있습니다.

the_weather / weather / views.py

def index(request):
    cities = City.objects.all() #return all the cities in the database

    url = 'http://api.openweathermap.org/data/2.5/weather?q={}&units=imperial&appid=YOUR_APP_KEY'

    if request.method == 'POST': # only true if form is submitted
        form = CityForm(request.POST) # add actual request data to form for processing
        form.save() # will validate and save if validate

    form = CityForm()
    ...

를 전달 request.POST하면 양식 데이터의 유효성을 검사 할 수 있습니다.

이제 도시 이름을 입력하고 추가를 클릭하면 표시되는 것을 볼 수 있습니다. 마이애미를 다음 도시로 추가하겠습니다.

if블록에서 빠져 나오면 양식이 다시 생성되어 원하는 경우 다른 도시를 추가 할 수 있습니다. 나머지 코드는 동일한 방식으로 작동합니다.

결론

이제 앱에서 여러 도시의 날씨를 추적 할 수 있습니다.

이 기사에서는 뷰, 모델, 양식 및 템플릿과 같은 Django의 다양한 부분을 사용하여 작업해야했습니다. 또한 실제 날씨 데이터를 얻기 위해 Python 라이브러리 요청을 사용해야했습니다. 따라서 앱이 단순하더라도 더 복잡한 앱에서 동일한 개념을 많이 사용하게됩니다.

 

출처 : https://www.digitalocean.com/community/tutorials/how-to-build-a-weather-app-in-django