Django погода часть № 1

21 апреля 2019 г. 0:00


В прошлый раз у нас получилось создать проект на Django, запустить отладочный сервер и это уже само по себе круто! Но как я и обещал в этот раз мы сделаем что ни будь полезное, идея в следующем: было бы не плохо иметь своё собственное веб-приложение которое например показывало бы погоду, текущий курс доллара, Биткоин, и например давало бы возможность включить/выключить свет в комнате (для этого нам потребуются микроконтроллеры, реле и другие радиодетали), но это уже другая история. Начинать надо с малого и поэтому для начала сделаем отображение погоды на нашем домашнем сайте. Погоду будем брать с сервиса Яндекс Погода, проще всего использовать готовый виджет чем делать GET – запросы через API погоды, так и поступим.

Для начала создадим новый проект, если вы не читали, как это сделать или забыли, то в этой статье подробно описано, подробно останавливаться я на этом не буду, у себя я создал проект под названием dashboard.

И так после создания проекта нам необходимо добавить функциональности нашему сайту. Реализуется функциональность в отдельных приложениях  Django.

Приложение в терминологии Django это фрагмент функциональности более или менее независимый от таких же фрагментов входящих в состав проекта. Я знаю – ничего не понятно, сейчас попробую объяснить на нашем примере:

  • Нам надо получить погоду – это одно приложение.
  • Нам нужно получить курс Биткоин, Лайткоин и т.д. – это второе приложение.
  • Нам нужно научить наше приложение работать с внешним миром (включать/выключать свет) – это третье приложение.

Таких приложений в проекте может быть очень много от авторизации пользователей до постинга новостей в разные соц.сети с отправкой писем на e-mail. Мы конечно можем делать всё перечисленное в одном приложении, но по мере возрастания функциональности на нашем сайте кода будет всё больше, сваливаться он будет в одни и те же модули и в конце концов будет проще всё написать с нуля чем в этом разобраться. Именно поэтому в Django надо придерживаться подхода каждое отдельное приложение отвечает за свою функциональность.

Довольно теории давайте создадим приложение, отвечающее за показ погоды. Для начала выполним миграции, для создания таблиц в базе данных:

python manage.py migrate

После этого создадим приложение:

python manage.py startapp weather

Результатом выполнения этой команды будет создание приложения weather в нашем проекте dashboard. Получиться у нас должно следующее:

И так после создания нового приложения в проекте давайте зарегистрируем его в файле settings.py, откроем его и найдём следующий фрагмент кода:

INSTALLED_APPS = [

    'django.contrib.admin',

    'django.contrib.auth',

    'django.contrib.contenttypes',

    'django.contrib.sessions',

    'django.contrib.messages',

    'django.contrib.staticfiles',

]

Список хранящийся в переменной INSTALLED_APPS (переменные мы рассматривали в этом посте) перечисляет все приложения зарегистрированные или установленные в нашем проекте. Добавим и наше приложение в конец этого списка:

INSTALLED_APPS = [

    'django.contrib.admin',

    'django.contrib.auth',

    'django.contrib.contenttypes',

    'django.contrib.sessions',

    'django.contrib.messages',

    'django.contrib.staticfiles',

    'weather',

]

Как уже объяснялось, выше каждое приложение отвечает за свою часть функционала, так например django.contrib.admin отвечает за панель администрирования, django.contrib.auth отвечает за проверку авторизации на сайте, наше приложение будет отвечать за отображение погоды на сайте.

Django позволяет динамически генерировать HTML страницы и самый распространенный подход – это использование шаблонов. В шаблонах используется статический html код и динамические данные описанные специальным синтаксисом. Django предоставляет собственную систему шаблонов, которая состоит из языка шаблонов Django (Django Template Language, DTL)  и шаблонизатора Jinja2.

Шаблоны настраиваются с помощью настройки TEMPLATES, в этом списке представлена настройка Django для использования шаблонов.

TEMPLATES = [

    {

        'BACKEND': 'django.template.backends.django.DjangoTemplates',

        'DIRS': [os.path.join(BASE_DIR, 'templates')],

        'APP_DIRS': True,

        'OPTIONS': {

            'context_processors': [

                'django.template.context_processors.debug',

                'django.template.context_processors.request',

                'django.contrib.auth.context_processors.auth',

                'django.contrib.messages.context_processors.messages',

            ],

        },

    },

]

 

BACKEND – путь к классу бэкенда шаблонов.

DIRS – список каталогов с шаблонами, бэкенд ищет в них шаблоны в указанном порядке.

APP_DIRS – указывает надо ли искать шаблоны в установленных приложениях.

О context_processors мы поговорим в одном из следующих постов.

В конечном итоге листинг файла settings.py следующий:

import os

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

# Quick-start development settings - unsuitable for production

# See https://docs.djangoproject.com/en/2.2/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!

SECRET_KEY = «Здесь Ваш СЕКРЕТНЫЙ ПРОЕКТА»

# SECURITY WARNING: don't run with debug turned on in production!

DEBUG = True

ALLOWED_HOSTS = []

# Application definition

INSTALLED_APPS = [

    'django.contrib.admin',

    'django.contrib.auth',

    'django.contrib.contenttypes',

    'django.contrib.sessions',

    'django.contrib.messages',

    'django.contrib.staticfiles',

    'weather',

]

MIDDLEWARE = [

    'django.middleware.security.SecurityMiddleware',

    'django.contrib.sessions.middleware.SessionMiddleware',

    'django.middleware.common.CommonMiddleware',

    'django.middleware.csrf.CsrfViewMiddleware',

    'django.contrib.auth.middleware.AuthenticationMiddleware',

    'django.contrib.messages.middleware.MessageMiddleware',

    'django.middleware.clickjacking.XFrameOptionsMiddleware',

]

ROOT_URLCONF = 'dashboard.urls'

TEMPLATES = [

    {

        'BACKEND': 'django.template.backends.django.DjangoTemplates',

        'DIRS': [os.path.join(BASE_DIR, 'templates')] ,

        'APP_DIRS': True,

        'OPTIONS': {

            'context_processors': [

                'django.template.context_processors.debug',

                'django.template.context_processors.request',

                'django.contrib.auth.context_processors.auth',

                'django.contrib.messages.context_processors.messages',

            ],

        },

    },

]

WSGI_APPLICATION = 'dashboard.wsgi.application'

# Database

# https://docs.djangoproject.com/en/2.2/ref/settings/#databases

DATABASES = {

    'default': {

        'ENGINE': 'django.db.backends.sqlite3',

        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),

    }

}

# Password validation

# https://docs.djangoproject.com/en/2.2/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [

    {

        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',

    },

    {

        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',

    },

    {

        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',

    },

    {

        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',

    },

]

# Internationalization

# https://docs.djangoproject.com/en/2.2/topics/i18n/

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = True

# Static files (CSS, JavaScript, Images)

# https://docs.djangoproject.com/en/2.2/howto/static-files/

STATIC_URL = '/static/'

Если значение переменной LANGUAGE_CODE  поменять на 'ru-ru', то начальная страница Django будет отображаться на русском языке, предлагаю Вам это проверить.

Ну что ж настала пора создать наш шаблон для подключения к нему виджета погоды, но это мы сделаем уже во второй части.


Основы Django | Уроки Django | Установка Django |