Введение в Django

Подключение к базе данных

Разбить на страницы
Показывать лекцию целиком

Цель лекции: Рассмотреть основные особенности поддерживаемых баз данных; ознакомились со структурой файла миграции; рассмотреть особенности использования Django с NoSQL, реализовали простейший проект MongoDB на Django.

Ключевые термины: Django, база, фреймворк, файл, SQL, миграция, проект, данные, field, class, url, python, схема, модель, слияние

Django - это фреймворк с агностическим подходом к базе данных, это означает, что поля базы данных, предоставляемых Django предназначены для работы в разных базах данных, таких как SQLite, Oracle, MySQL и PostgreSQL. Действительно, они также работают с некоторыми сторонними базами данных. PostgreSQL является небольшой базой данных для Django в рабочей фазе, в то время как для окружения разработки используется SQLite, и вы в конечном итоге проделаете много работы, если не захотите использовать СУБД для вашего проекта. Эта лекция даст вам подробную разницу между двумя типами и покажет вам, что лучше подходит для Django, и, так же, как мы действительно можем их имплементировать в наш проект Django.

Прежде всего, давайте посмотрим на разницу между SQL и NoSQL.

SQL против NoSQL

Базы данных SQL и реляционные базы данных использовались повсеместно в течение очень долгого времени; в самом деле, говоря о базах данных, подразумевали базы данных SQL, до тех пор, пока не был придуман новый термин — NoSQL.

Мы поговорим о высокоуровневых различиях между SQL и NoSQL. Ниже приведены различия между ними:

SQL база данных (RDBMS) База данных NoSQL
SQL базы данных являются реляционными базами данных (СУБД) Баз данных NoSQL- нереляционные или распределенные базы данных
SQL базы данных основаны на таблицах и ее отношения с другими таблицами NoSQL -документальная, пары ключ -значение, графические базы данных или хранение широких столбцов
База данных SQL хранит свои данные в строках таблицы NoSQL — это коллекция значений пара-ключ документов, графических данных или широкостолбцовых хранилищ
SQL базы данных имеют предопределенные схемы NoSQL имеет динамическую схему
Базы данных SQL вертикально масштабируемы Базы данных SQL горизонтально масштабируемы
Примеры баз данных SQL: MySQL, Oracle, SQLite, PostgreSQL и MS SQL Примеры баз данных NoSQL: MongoDB, BigTable, Redis, RavenDB, Cassandra, HBase, Neo4j и CouchDB

Давайте попробуем понять основные особенности некоторых из известных баз данных SQL и NoSQL.

Базы данных SQL

Следующие разделы посвящены различным SQL базами данных и их использованию.

MySQL – open source

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

  • Репликация: MySQL поддерживает репликацию, то есть путем репликации базы данных MySQL, рабочая нагрузка может быть значительно уменьшена от одной машины и приложения могут быть легко расширены
  • Сегментирование: Когда количество операций записи очень большое, сегментирование помогает путем разбиения серверного приложения, которое делит базу данных на небольшие куски.
  • PostgreSQL

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

    Развитие расширенных запросов и особенностей PostgresSQL сделали возможным достигнуть комплексной строки обычного запроса SQL в гораздо более простой строке для записи запроса. Однако имплементация массивов, hstore, JSON и так далее сложнее с помощью обычных SQL баз данных.

    NoSQL базы данных

    Эта концепция была введена, когда горизонтальное масштабирование было непросто осуществить и базы данных на основе реляционных СУБД не могли масштабироваться, так как должны были. Часто этот термин расшифровывается Not Only SQL (Не только SQL). Он предоставляет механизм для хранения и извлечения данных, отличных от традиционных методов SQL.

    MongoDB

    MongoDB – одна из самых популярных документальных NoSQL баз данных, так как она хранит данные в JSON-подобных документах. Это нереляционная база данных с динамической схемой. Она была разработана основателями компании DoubleClick. Она написана на C++ и в настоящее время используется в некоторых крупных компаниях, таких как The New York Times, Craigslist и MTV Networks. Ниже приведены некоторые преимущества и сильные стороны MongoDB:

  • Скорость: Для простых запросов, она дает хорошую производительность, так как все данные связаны в единый документ, который убирает операции соединения
  • Масштабируемость: Она горизонтально масштабируемая, то есть, вы можете уменьшить рабочую нагрузку путем увеличения числа серверов в пуле ресурсов вместо того чтобы полагаться на автономный ресурс.
  • Управляемость: Она простая в использовании для разработчиков и администраторов. Это также дает MongoDB возможность совместного использования баз данных.
  • Динамическая схема: Она дает вам гибкость, чтобы развивать вашу схему данных без изменения существующих данных
  • CouchDB

    CouchDB является также документальной базой данных NoSQL. Он хранит данные в виде документов JSON. Ниже приведены некоторые преимущества и сильные стороны CouchDB:

  • Без схемы: будучи членом семейства NoSQL, она также имеет свойство без схемы, которое делает ее более гибким, поскольку у него есть формат документов JSON для хранения данных
  • HTTP-запрос: вы можете получить доступ к вашей документальной базе данных, используя веб-браузер
  • Разрешение конфликтов: Имеется автоматическая система разрешения конфликтов, которая является полезной, когда вы собираетесь использовать распределенную базу данных
  • Легкость репликации: репликация довольно проста
  • Redis

    Redis является еще одной базой данных NoSQL open source, которая используется главным образом в связи с молниеносной скоростью. Она написана на языке ANSI С. Ниже приведены некоторые преимущества и сильные стороны Redis:

  • Структуры данных: Redis обеспечивает до такой степени эффективные структуры данных, что иногда называют как серверные структуры данных. Ключи, хранящиеся в базе данных может быть хэшами, списками и строками и могут быть отсортированным или несортированным набором.
  • Redis в качестве кэша: вы можете использовать Redis в качестве кэша путем имплементации ключей с ограниченным временем для повышения производительности.
  • Очень быстро: Она рассматривается как один из самых быстрых NoSQL серверов, так как она работает с набором данных в памяти.
  • Настройка системы базы данных

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

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

    В отличие от клиент-серверных систем баз данных SQLite не требуют резидентных процессов в памяти и база данных хранится в одном файле, что делает его идеальным для нашего окружения разработки.

    Вот почему мы использовали до сих пор эту базу данных на протяжении всего этого проекта.Конечно, вы можете использовать свою любимую СУБД. Мы можем указать Django, какую СУБД использовать путем редактирования файла конфигурации. Стоит также отметить, что, если вы хотите использовать MySQL, вам будет нужно установить MySQL, которая является драйвером MySQL для Python.

    Установка системы базы данных в Django очень проста; все, что вам нужно сделать, это, во-первых, установить базу данных, которую вы хотите настроить, а затем добавить несколько строк конфигурации в файле settings.py и установка базы данных будет завершена.

    Настройка MySQL

    Мы установим и настроим MySQL связанные с ним плагины шаг за шагом в следующих разделах.

    Установка MySQL в Linux - Debian

    Выполните следующую команду для установки MySQL в Linux (Debian):

    sudo apt-get install mysql-server 

    После выполнения этой команды, вам будет предложено установить MySQL и настроить базу данных с помощью имени пользователя и пароля.

    Установка плагина MySQL для Python

    Для установки плагинов MySQL, которые вам требуются, используйте команду:

    pip install mysql-python

    Теперь откройте файл settings.py и добавьте следующие строки для соединения Django с MySQL:

    DATABASES = {
    'default':	{
    'ENGINE':	'django.db.backends.mysql',
    'NAME':	'django_db',
    'USER': 'your_username',
    'PASSWORD':	'your_password',
    }
    }
    

    Вот и все, то, вам нужно сделать сейчас, это воссоздать все таблицы в новой базе данных, которую вы просто настроили и выполните следующую команду:

    python manage.py syncdb

    Вы получите исключение django.db.utils.ConnectionDoesNotExist, если не определена база данных, к которой вы пытаетесь получить доступ

    Преимуществом Django является, что вы можете использовать его с несколькими базами данных одновременно. Однако вы можете задуматься, какова необходимость использовать несколько баз данных в одном проекте?

    До тех пор, пока баз данных NoSQL не существовало, в большинстве случаев, одна и та же база данных часто используется для учета всех типов данных, от критически важных данных, например, данные пользователя, до дампов данных, таких как журналы; все находились в той же базе данных и системы сталкивались с проблемами во время масштабирования системы.

    Для системы с несколькими базами данных может быть идеальным решением хранить реляционную информацию, например пользователей,их роль и другую учетную информацию, в базе данных SQL, такой как MySQL. Данные приложений, которые является независимыми, могут храниться в базе данных NoSQL, такой как MongoDB.

    Нам необходимо определить несколько баз данных через файл конфигурации. Django необходимо указать, когда вы хотите использовать более чем одну базу данных с серверами базы данных, которые вы используете. Так, в файле settings.py, вам нужно изменить настройку DATABASE с отображением псевдонимов базы данных.

    Соответствующий пример конфигурации нескольких баз данных может быть записан следующим образом:

    DATABASES = {
     'default':	{
    'NAME':	'app_data',
    'ENGINE':	'django.db.backends.postgresql_psycopg2',
    'USER':	'postgres_user',
    'PASSWORD':	's3krit'
    }
    'users': {
    'NAME':	'user_data',
    'ENGINE' :	'django.db.backends.mysql',
    'USER':	'mysql_user',
    'PASSWORD':	'priv4te'
    }
    }
    

    В предыдущем примере используется две базы данных, е MySQL и PostgreSQL с требуемыми учетными данными.

    Миграция и потребность в миграции

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

    Схема миграции с Django имеет длительную и сложную историю; за последние несколько лет единственным выбором было стороннее приложение South. Если вы думаете о важности миграции, Django 1.7 был выпущен с встроенной поддержкой миграции.

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

    Шаги South Миграция Django
    Начальная миграция Запустите syncdb а затем /manage.py schemamigration <appname> --initial ./manage.py makemigrations <appname>
    Миграция применения ./manage.py migrate <appname> ./manage.py migrate <appname>
    Не первая миграция ./manage.py schemamigration <appname> --auto ./manage.py makemigration <appname>

    Таким образом, как мы можем видеть из таблицы, что миграция Django в основном следует тому же процессу, что и South, по крайней мере для стандартного процесса миграции — это немного упрощает дело.

    Новые возможности миграции Django

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

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

  • Улучшенная формат миграции: значительно улучшенный формат миграции читаемый и можно таким образом оптимизировать или проверить его без фактического исполнения
  • Перемещение: Нет необходимости держать или выполнять всю историю миграции каждый раз, тогда как возможно создавать новые первые миграции по мере развития проекта
  • Улучшено автоматическое обнаружение: Изменения новых и пользовательских полей обнаруживаются более легко, так как миграция построена в улучшенном поле API
  • Лучше обнаружение слияний: новый формат миграции будет автоматически разрешать слияние между различными ветвями VCS, которые больше не будет нужны в работе, если мы способны к слиянию изменений.
  • После того, как мы настроим проект и запустить приложение, ваше приложение создаст необходимые таблицы в базе данных, вы не должны делать сложные изменения моделей Django, то есть, вам не следует удалять атрибуты из класса. Однако практически, это не возможно, так как вам может потребоваться изменить ваши классы моделей соответственно. В таких случаях у нас есть решение, чтобы исправить такого рода проблемы. Этот процесс называется миграцией, и, в Django, эти миграции выполняются с помощью модуля South.

    До версии Django 1.8.4, которая является последней, необходимо было отдельно устанавливать модуль South. Однако начиная с миграции версии Django 1.7, модуль South встроен в систему. Вы могли всегда делать это, например, когда вы изменили (изменения, такие как добавление новых атрибутов) ваши классы моделей, используя следующую команду:

    python manage.py syncdb

    В новой версии manage.py syncdb была признана устаревшей для миграции, но, если вы все еще хотите использовать старый способ, он работает.

    Поддержка внутреннего интерфейса

    Очень важно получить поддержку миграции для любого приложения Django, которое используется в рабочей фазе. Таким образом выбор базы данных которая изначально поддерживается модулем миграции, будет всегда лучшим решением

    Некоторые из наиболее совместимых баз данных являются следующими:

  • PostgreSQL: Что касается условий миграции или схемы поддержки, PostgresSQL наиболее совместимая база данных из всех.

    Вы можете инициализировать новый столбец значением null = True, так он будет добавлен гораздо быстрее.

  • MySQL: MySQL -широко используемая база данных, так как Django поддерживает его бесшовно. Подвох в том, что здесь нет поддержки транзакций, когда операции изменения схемы, завершены, и, если операция не удалась, вам придется вручную откатить изменения. Кроме того, для каждого обновления схемы, переопределяются все таблицы, это может занять много времени, и запуск вашего приложения тоже может занять много времени.
  • SQLite: Это база данных по умолчанию, которая поставляется с Django и используется в основном для целей разработки . Таким образом она имеет мало изменения схемы поддержки, только в следующих случаях:
  • Создание новой таблицы
  • Копирование данных
  • Удаление старой таблицы
  • Переименование таблицы
  • Как сделать миграции?

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

  • makemigrations: Основано на изменениях, внесенных в модели, которая готовит запрос миграции
  • migrate: Применяет изменения, подготовленные запросом makemigrations и выводит их статус
  • sqlmigrate: Отображает запрос SQL, который подготовил запрос makemigrations.
  • Таким образом поток для схемы миграции Django может быть сформулирован следующим образом:

    python manage.py makemigrations ‘appname’

    Это подготовит файл миграции, который будет выглядеть аналогично следующему:

    Migrations for 'app_name':
    0003_auto.py:
    - Alter field name on app_name
    

    Затем после того, как файл будет создан, , вы можете проверить структуру каталогов. Вы увидите файл с именем 0003_auto .py в папке миграции; можно применить изменения с помощью следующей команды:

    python manage.py migrate appname 

    Ниже приведены действия, которые необходимо выполнить:

    Synchronize non migrated apps: sessions, admin, messages, auth, staticfiles, contenttypes Apply all migrations: appname Synchronizing apps without migrations:

    Creating tables...
    Installing custom SQL...
    Installing indexes... 
    Installed 0 object(s) from 0 fixture(s)
    Running migrations:
    Applying appname.0003_auto... OK
    

    Сообщение ОК говорит о том, что миграция успешно завершилась.

    Чтобы добавить больше понимания миграции можно объяснить с помощью следующей схемы:

    Существует три отдельных сущности:

  • Исходный код
  • Миграция файлов
  • База данных
  • Разработчик вносит изменения в исходный код, главным образом в файл models.py и изменяет ранее определенную схему. Например, когда они создают новое поле в соответствии с требованиями бизнеса, или обновляют поле max_length с 50 до 100.

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

    Во-первых, мы должны создать начальную миграцию приложения:

     python manage.py makemigrations tweets

    Вывод этой команды следующий:

    Migrations for 'tweet':
    0001_initial.py:
     Create model HashTag
     Create model Tweet
     Add field tweet to hashtag
    

    Это показывает, что первоначальная миграция был создана.

    Давайте теперь изменим нашу модель tweet, которая в настоящее время выглядит следующим образом:

    text = models.CharField(max_length=160, null=False, blank=False)

    Мы изменим предыдущую модель tweet на:

    text = models.CharField(max_length=140, null=False, blank=False)

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

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

    python manage.py makemigrations tweets

    Вывод этой команды следующий:

    Migrations for 'tweets':
    0002_auto_20141215_0808.py:
     Alter field text on tweets
    

    Как вы можете видеть, обнаружено изменение в нашем поле.

    Для проверки мы откроем нашу базы данных SQL и проверим текущую схему нашей таблицы tweet.

    Соединитесь с MySQL с помощью команды::

    mysql -u mysqlusername - pmysqlpassword mytweets

    В консоли MySQL напишите:

    mysql > desc tweettweet; 

    Это покажет вам схему таблицы tweet, следующим образом:

    | Field | Type | Null | Key | Default | Extra |
    +---------------+-------------+--------+-------+-------------------+
    |userid | int(ll) | NO | MUL| NULL	|	|
    |text | varchar(160) | NO |	|NULL |	|
    |created_date | datetime | NO	|	| NULL	|	|
    |country | varchar(30) | NO |	|	NULL	|	|
    | is_active | tinyint(l) | NO |	| NULL |	|
    +---------------+-------------+--------+-------+-------------------+
            6 rows in set (0.00 sec)
    

    Так как мы еще не применили наши миграции, база данных ясно отображает текст в символьном поле в 160 символов:

    text | varchar(160) | NO |	| NULL

    Мы сделаем именно это, как только применим миграции:

    python manage.py migrate tweets

    Далее следуют операции, которые нам нужно выполнить:

    Apply all migrations: tweet
          Running migrations:
    Applying tweet.0002_auto_20141215 0808.. . OK
    

    Наша миграция была успешно применена; давайте проверим то же самое из-под базы данных.

    Чтобы выполнить ту же команду desc MySQL в таблице tweet_tweet, используйте следующую команду:

    MySQL > desc tweettweet;
    
    
    
    
    | Field | Type | Null | Key | Default | Extra |
    +---------------+-------------+--------+-------+-------------------+
    |	userid | int(ll) | NO | MUL	|	NULL	|	|
    |	text | varchar(140) | NO |	|	NULL |	|
    |	created_date | datetime | NO	|	| NULL	|	|
    |	country | varchar(30) | NO |	|	NULL	|	|
    | is_active | tinyint(l) | NO |	| NULL |	|
    +---------------+-------------+--------+-------+-------------------+
            6 rows in set (0.00 sec)
    

    И действительно! Наша миграция была успешно применена:

    |	text | varchar(140) | NO |	|	NULL |	|	

    Как миграции узнают, что требуется подвергнуть миграции

    Django никогда не запускает миграцию более чем один раз на одной и той же базе данных, что означает, что она сохраняет эту информацию. Эта информация управляется таблицей под названием django_migrations, которая создается первый раз, когда запускается приложение Django, и для каждой миграции после этого, вставляется новая строка.

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

    mysql> select * from django_migrations	-+		-+			+	
    	-+		-+			+	
    id	1 app | +	name	| applied |
    		+	+
    i	tweet	1 0001	initial | 2014-12-15 08:02:34 |
    2	tweet -+		1 0002 -+		_auto_20141215_0808 | 2014-12-15 08:13:19 | 	+	
    

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

    Это означает, что даже если вы измените файл миграции вручную, он будет пропущен.

    Это обращает на себя внимание, так как вы не хотите запускать одну и ту же миграцию дважды.

    Конечно, если вы действительно хотите запустить одну и ту же миграцию дважды, то вам следует удалить запись таблицы "THIS IS NOT A OFFICIALLY RECOMMENDED WAY" и все будет прекрасно работать.

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

    Например, если вы наберете следующую команду, все ваши миграции для приложения tweet обратятся:

    python manage.py migrate tweet zero

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

    Файл миграции

    Итак, что же содержит файл миграции, и что действительно происходит при выполнении команды:

    python manage.py migrate tweet

    После ее выполнения, вы можете увидеть каталог migrations, где хранятся файлы миграции. Давайте взглянем на них.. так как это файлы Python, то их можно легко понять.

    Откройте файл tweet/migrations/0001_initial.py, так как это файл, где создан код первоначальной миграции. Он должен выглядеть примерно так:

    # -*- coding: utf-8 -*-
    from  future  import unicode_literals
    from django.db import models, migrations
    class Migration(migrations.Migration): dependencies = [
    ('user_profile',	'first'),
    ]
    operations = [
    migrations.CreateModel( name='HashTag', fields=[
    ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
    ('name', models.CharField(unique=True, max_length=64)),
    3,
    options = {
    },
    bases=(models.Model,),
    ) ,
    migrations.CreateModel( name='Tweet', fields=[
    ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
    ('text', models.CharField(max_length=160)),
    ('created_date', models.DateTimeField(auto_now_add=True)),
    ('country', models.CharField(default=b'Global', max_length=30)),
    ('is_active', models.BooleanField(default=True)),
    ('user', models.ForeignKey(to='user_profile.User')),
    ] ,
    options = {
    },
    bases=(models.Model, ) ,
    ) ,
    migrations.AddField( model_name='hashtag' , name='tweet',
    field=models.ManyToManyField(to='tweet.Tweet'),preserve_default=True,
    ) ,
    }
    

    Для того, чтобы миграция действительно работала, здесь должен быть класс Migration () который наследует от модуля django.db.migrations.Migration. Это основной класс, который используют инструменты миграции, и этот класс миграции содержит два основных списка:

  • Зависимости: Это список других миграций, которые должны быть выполнены перед тем, как эта миграция запустится. В случаях, где есть зависимость, таких как, отношения с внешним ключом, модель внешнего ключа должна существовать прежде самого ключа. В предыдущем случае мы имеет такую зависимость в виде параметра user_profile.
  • Операции: Этот список содержит список миграций, которые должны быть применены, и операция миграции может относиться к одной из следующих категорий:
  • CreateModel: Как понятно из имени, очевидно, что эта операция создает новую модель. В предудущем файле модели вы можете видеть такие строки:
    migrations.CreateModel ( 
    name='HashTag',……
    migrations.CreateModel(
    name='Tweet',……..
    

    Эти строки миграции создают новую модель с определенными атрибутами.

  • DeleteModel: Содержит операторы для удаления модели из базы данных. Противоположно методу CreateModel.
  • RenameModel: Переименовывает модель и дает новое имя взамен старого.
  • AlterModelTable: Изменяет имя связанной с моделью таблицы.
  • AlterUniqueTogether: Уникально ограничивает таблицу, которая изменилась.
  • AltelndexTogether: Изменяет пользовательский набор индексов модели.
  • AddField: Просто добавляет поле к существующей модели.
  • RemoveField: Удаляет поле из модели.
  • RenameField: Переименовывает поле и дает новое имя взамен старого.
  • Схема миграции – не единственное, что требуется для миграции при обновлении приложения; Другой важной вещью являются данные миграции.

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

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

  • Загрузка внешних данных в приложение
  • Когда есть изменение в схеме модели и набор данных нужно обновить
  • Давайте поиграем с нашим проектом, загрузив твит из файла username.txt. Создайте пустую миграцию для нашего проекта, используя следующую команду:

    python manage.py makemigrations --empty tweet

    Это создаст файл миграции mytweets/migrations/003_auto<date_ time_stamp>.py.

    Открыв этот файл, он будет выглядеть следующим образом:

    # -*- coding: utf-8 -*-
    from __future__ import unicode_literals
    
    from django.db import models, migrations
    
    
    class Migration(migrations.Migration):
    
        dependencies = [
            ('tweets', '0002_auto_20150926_1834'),
        ]
    
        operations = [
        ]
    

    Здесь нет ничего, кроме основной структуры инструмента миграции Django, и чтобы организовать миграцию данных, мы должны добавить функцию RunPython () — в операции, как показано:

    #	 -*- coding: utf-8 -*-
    from  future  import unicode_literals
    from django.db import models, migrations
    def load_data(apps, schema_editor):
    Tweet(text= 'This is sample Tweet', created_date=date(2013,11,29), country='India', is_active=True,
    ) .save () 
    class Migration(migrations.Migration):
    dependencies = [
    ('tweet',	'0002_auto_20141215_0808 ' ),
    ]
    operations = [
    migrations.RunPython(load_data)
    ]
    

    Теперь выполним команду migrate:

    python manage.py migrate

    Вот операции, которые вам необходимо выполнить:

    Synchronize unmigrated apps: userprofile
    Apply all migrations: admin, contenttypes, tweet, auth, sessions Synchronizing apps without migrations:
    Creating tables...
    Installing custom SQL...
    Installing indexes...
    Running migrations:
    Applying contenttypes.000linitial... FAKED
     Applying auth.0001initial... FAKED 
    Applying admin.0001initial... FAKED 
    Applying sessions.0001_initial... FAKED
     Applying tweet.0003_auto_20141215_1349 ... OK
    

    После выполнения предыдущей команды, команда мигрировала все приложения и в наконец применила нашу миграцию, в которой мы создали новый твит из загруженных данных:

    mysql> select * from tweettweet;
    +	+	+	+	
    | id | user_id | text | created_date | country | is_active |
    +	+	+	+	
    | 1 | 1 | This Tweet was uploaded from the file. | 2014-12-15 14:17:42 | India | 1 |
    +-----+---------+-------------------------------------------+---------
    2 rows in set (0.00 sec)
    

    Невероятно, правда?

    Этот типа решения очень необходим, когда у вас есть внешние данные в форме JSON или XML-файла.

    Идеальным решением будет использовать аргумент командной строки, чтобы получить путь к файлу и загрузить данные в виде:

    python load data tweet/initial_data.json

    Не забудьте добавить ваши каталоги миграции на Git, так как они так же важны, как и ваш исходный код.

    Django с NoSQL

    Django официально не поддерживает базы данных NoSQL, но имея в запасе такое большое сообщество разработчиков, Джанго имеет форк с MongoDB в качестве внутренней базы данных.

    Для того, чтобы вам продемонстрировать работу, мы будем использовать проект Django-Norel для настройки Django с базой данных MongoDB.

    Вы можете найти подробную информацию об этом на http://django-nonrel.org/.

    MongoDB можно установить, выполнив шаги, указанные на http://docs.mongodb.org/manual/installation/ отталкиваясь от конфигурации, которая у вас есть.

    Сейчас, мы настроим MongoDB для Debian- версии Linux (в частности, Ubuntu).

    Импортируйте открытый ключ GPG MongoDB:

    sudo apt-key adv--keyserver hkp://keyserver.ubuntu.com:80--recv 7F0CEB10

    Создайте файл списка для MongoDB:

    echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist lOgen' | sudo tee /etc/apt/sources.list.d/mongodb.list

    Перезагрузите локальный пакет базы данных:

    sudo apt-get update

    Установите пакеты MongoDB:

    sudo apt-get install -y mongodb-org

    Запустите MongoDB:

    sudo service mongod start

    Проект одностраничного приложения – сокращатель URL-ссылок

    Существует два способа, которыми MongoDB может использоваться совместно c Django, которые заключаются в следующем:

  • MongoEngine: Это Документ-объектное отображение (думается это ORM, но для документальных баз данных), которое используется для работы с MongoDB из-под Python
  • Django-nonrel: Это проект для поддержки Django на нереляционных (NoSQL) базах данных; в настоящее время он поддерживает MongoDB
  • MongoEngine

    Прежде чем двигаться дальше и показать вам, как настроить MongoEngine на совместную работу с Django, нам требуется установка MongoEngine. Установите MongoEngine, введя следующую команду:

    pip install mongoengine

    Для того чтобы защитить предыдущего проект, который мы создали и добиться лучшего понимания, мы создадим отдельный новый проект для конфигурации MongoDB, и мы используем наш существующий проект для настройки MySQL:

    django-admin.py startproject url_shortner
    cd url_shortner
    python manage.py startapp url
    

    Это создаст базовую структуру проекта, как мы очень хорошо знаем.

    Подключение MongoDB совместно с Django

    Нам придется изменить файл, settings.py, и если мы используем только MongoDB для проекта, что верно в данном случае, то мы можем игнорировать стандартный параметр базы данных. Все, что мы должны сделать - вызвать метод connect () на файл settings.py.

    Мы разместим пустой внутренний интерфейс для MongoDB. Просто замените следующий код в файле settings.py, которое выглядит следующим образом:

    DATABASES = {
    'default' : {
    'ENGINE':	'django.db.backends.sqlite3',
    'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
    }
    

    Замените предыдущий код следующим:

    DATABASES = {
    'default' : {
    'ENGINE':	'django.db.backends.dummy'
    }
    }
    

    Аутентификация в Django

    Преимуществом MongoEngine является, что он включает внутренний интерфейс аутентификации Django.

    Модель пользователя становится документом MongoDB и имплементирует большинство методов и атрибутов нормальной модели пользователя Django , что делает MongoEngine совместимым с Django. Мы также можем использовать инфраструктуру аутентификации и декораторов, такие, как методы login_required () и authentication().Модуль auth также содержит метод get_user (), который принимает идентификатор пользователя в качестве аргумента и возвращает объект пользователя.

    Для включения этого внутреннего интерфейса для MongoEngine, добавьте следующую запись в файл settings.py:

    AUTHENTICATION_BACKENDS = (
    'mongoengine.django.auth.MongoEngineBackend',
    )
    

    Хранение сеанса

    В Django можно использовать различные базы данных для хранения сеанса приложения .Чтобы включить сеанс MongoEngine, который хранится в MongoDB, должна быть запись параметра django.contrib.sessions.middleware SessionMiddleware в MlDDLEWARE_CLASSES в файле settings.py. Также должна быть запись о django.contrib.sessions в INSTALLED_APPS, которая уже есть, так как мы начали проект с основной структуры Django.

    Теперь все, что вам нужно сделать это добавить следующую строку в файл settings.py:

    SESSION_ENGINE = 'mongoengine.django.sessions'
    SESSION_SERIALIZER = 'mongoengine.django.sessions.BSONSerializer'
    

    Сейчас мы все настроили для небольшого демонстрационного проекта, где мы имплементируем проект сокращателя URL-адресов на MongoDB.

    Давайте создадим сперва URL-модель, в которой мы будем хранить все длинные и соответствующие им короткие URL-адреса.

    Перейдите к файлу url/models.py:

    from django.db import models 
    from mongoengine import * 
    connect('urlShortener')
    

    Вы уже знакомы с двумя строками предыдущего кода, которые импортирует модули.

    Третья строка, то есть, connect('urlShortener'), соединяет Django с базой данных MongoDB с именем urlShortener.

    MongoDB предоставляет много механизмов подключения, и вы можете выбрать , как, в следующем фрагменте:

    from mongoengine import connect
     connect('project')
    

    Метод, котоый мы используем, принимает MongoDB от порта по умолчанию, которым является 27017; если вы используете MongoDB на другой порту, используйте метод connect() для подключения:

    connect('project1', host='192.168.1.35', port=12345)

    Если вы настроили пароль для MongoDB, можно передать параметры так:

    connect('projectl', username='webapp', password='pwdl23')

    Как и поля модели Django по умолчанию, MongoDB также предоставляет вам различные поля, которые представлены следующими:

  • BinaryField: Это поле используется для хранения необработанных двоичных данных.
  • BooleanField: Это поле логического типа.
  • DateTimeField: Это поле дата-время.
  • ComplexDateTimeField: Это поле высчитывает микросекунды вместо округления их, как это делает DateTimeField.
  • DecimalField: Это поле десятичных чисел с фиксированной точкой.
  • DictField: Это поле словаря, который описывает стандартный словарь Python. Это похоже на внедренный документ, но без определения структуры.
  • DynamicField: Это действительно поле динамического типа, способного обрабатывать различные типы данных.
  • EmailField: Это поле, которое проверяет адрес электронной почты в качестве входных данных.
  • FileField: Это поле для хранения GridFS.
  • FloatField: Это поле числа с плавающей точкой.
  • GeoPointField: Это список, который хранит координаты долготы и широты.
  • ImageField: Это поле для хранения файла изображения.
  • IntField: Это поле 32-разрядного целого числа.
  • ListField: Это поле списка, который оборачивается вокруг стандартного поля, разрешая использовать несколько экземпляров поля в качестве списка в базе данных.
  • MapField: Это поле, которое отображаетимя на выбранный тип поля. Это похоже на DictField, за исключением того, что значение каждого элемента должно соответствовать указанному типу поля.
  • ObjectIdField: это поле, обернутое вокруг идентификатора объекта MongoDB
  • StringField: Это поле строки Юникод.
  • URLField: Это поле проекты проверяет ввод URL-адреса и многое другое.
  • По умолчанию поля не являются обязательными. Чтобы сделать поле обязательным, задайте требуемый ключевой аргумент поля в значение True. Поля также могут иметь ограничения проверки (например, максимальная длина в предыдущем примере). Поля также могут принимать значения по умолчанию, которые будут использоваться, если значение не указано. Значения по умолчанию могут при необходимости быть вызываемыми, которые будут вызываться для получения значения шин (как в предыдущем примере).

    Полный список различных полей можно увидеть на http://docs.mongoengine.org/en/latest/apireference.html.

    Теперь, мы создадим наш класс Url (), который будет похож на другие модели, которые мы создавали раньше, такие как tweets и так далее:

    class Url(Document):
    full_url = URLField(required=True)
    short_url = StringField(max_length=50, primary_key=True, unique=True)
    date = models.DateTimeField(auto_now_add=True)
    

    Давайте взглянем на следующий список терминов:

  • full_url: это поле URL-адреса, который будет хранить полный URL-адрес, и это тот же URL куда будет перенаправлен запрос, когда запрошен его короткий URL-адрес
  • short_url: это короткий URL-адрес для соответствующего длинного URL-адреса
  • date: это будет хранить дату, когда был создан объект Url.
  • Теперь мы двинемся к представлению и создадим два класса:

  • Index: Здесь пользователь может создавать короткие URL-адреса. Он также будет иметь метод post(), который сохраняет каждый длинный URL-адрес.
  • Link: Это контроллер перенаправления короткого URL-адреса. Когда запрашивается короткий URL-адрес, этот контроллер перенаправляет запрос на длинные URL-адреса, такие, как показано в следующем фрагменте кода:
  • class Index(View):
    def get(self, request):
    return render(request, 'base.html')
    def post(self, request): long_url = request.POST[1longurl1] short_id = str(Url.objects.count() + 1) url = Url()
    url.full_url = long_url url.short_url = short_id url.save() params = diet()
    params["short_url"] = short_id
    params['path'] = request.META['HTTP_REFERER']
    return render(request, 'base.html', params)
    

    Давайте взглянем на следующий список терминов:

  • Метод get прост: он перенаправляет запрос на файл base.html (который мы скоро создадим)
  • Метод post () принимает длинный URL-адрес из переменной запроса POST и устанавливает счетчик объекта, так как короткий URL-адрес сохраняет объект URL в базе данных:
  • params['path') = request.META['HTTP_REFERER']

    Это используется для передачи текущего пути представлению, так что короткий URL-адрес могжет быть сделан путем нажатия на тег привязки.

    Здесь показано,как этот URL-адрес объекта сохраняется в DB:

    { "_id"	: ObjectId("548d6ec8e389a24f5ea44258"), "full_url" :
    "http://sample_long_url", "short_url" : "short_url" }
    

    Теперь мы перейдем к классу Link (), который будет принимать запросы коротких URL-адресов и перенаправлять на длинный URL-адрес:

    class Link(View):
    def get(self, request, short_url): url = Url.objects(short_url=short_url) result = url [0]
    return HttpResponseRedirect(result.full_url)
    

    Параметр short_url –это код short_url от запрашиваемого URL-адреса:

    url = Url.objects(short_url=short_url)

    Предыдущая строка запрашивает базу данных для проверки, существует ли соответствующий длинный URL-адрес для данного короткий URL-адреса:

    return HttpResponseRedirect(result.full_url)

    Это перенаправляет запрос, чтобы найти длинный URL-адрес в базе данных.

    Теперь все, что нам нужно для представления, это создать файл base.html.

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

    Код для файла base.html выглядит следующим образом:

    <!DOCTYPE html>
    <html>
    <head lang="en">
    <meta charset="UTF-8">
    <title>URL Shortner</title>
    </head>
    <body>
    <form action="" method="post">
    {% csrf_token %}
    Long Url:<br>
    <textarea rows="3" cols="80" name="longurl"x/textarea>
    <br>
    <input type="submit" value="Get short Url">
    </form>
    <div id="short_url">
    {% if short_url %}
    <span>
    <a href="{{ path }}link/{{ short_url }}" target="_blank">{{ path }}link/{{ short_url }}</a>
    </span>
    {% endif %}
    </div>
    </body>
    </html>
    

    Это отобразит текстовую область с формой, и после отправки формы, покажет короткую ссылку под длинным URL-адресом.

    Чтобы заставить это работать, все, что нам нужно сделать сейчас , это создать требуемое отображение URL-адреса, который является следующим:

    url_shortner/urlmapping.py
    from django.conf.urls import patterns, url 
    from url.views import Index, Link 
    from django.contrib import admin 
    
    admin.autodiscover()
    urlpattems = patterns (' ',
    url(r'^$', Index.as_view()),
    url(r'^link/(\w+)/$', Link.as_view()),
    )
    

    Контрольные вопросы

  • В чем отличие между SQL и NoSQL базами данных?
  • Каким образом осуществляется аутентификация в Django?
  • Каким образом можно использовать MongoDB с Django проектом?
  • Для чего используются схемы миграции?
  • В чем заключается концепция South?
  • Упражнения

    Упражнение 1.

    Дополнить рассмотренный проект MongoDB отправкой ссылки по электронной почте

    Упражнение 2.

    Создайте систему обмена ссылками

    Упражнение 3.

    В виде таблицы оформите какие-либо особенности вышеприведенных баз данных, не рассмотренных в лекции

    Упражнение 4.

    Создать страницу профиля пользователя для сокращателя ссылок

    Список курсовых работ

  • Адаптация прототипа системы модерации твитов под
  • Разработка комплекта пользовательских фильтров и шаблонов для прототипа системы регистрации пользователей
  • Разработка комплекта пользовательских фильтров и шаблонов для продвинутой системы комментирования
  • Разработка комплекта пользовательских фильтров и шаблонов для прототипа системы ведения пользовательских блогов
  • Разработка комплекта пользовательских фильтров и шаблонов для прототипа сервиса мгновенного обмена собщениями
  • Разработка комплекта пользовательских фильтров и шаблонов для прототипа веб-сервиса для хранения изображений
  • Разработка комплекта пользовательских фильтров и шаблонов для прототипа веб-сервиса электронной почты
  • Разработка комплекта пользовательских фильтров и шаблонов для прототипа сервиса для ведения списка ежедневных дел
  • Разработка комплекта пользовательских фильтров и шаблонов для прототипа сервиса для учета рабочего времени
  • Разработка комплекта пользовательских фильтров и шаблонов для приложения для твитов
  • Краткие итоги

  • рассмотреть основные типы баз данных
  • изучить различия между SQL и NoSQL
  • изучить основные особенности разных типов данных
  • рассмотреть особенности настройки MySQL
  • рассмотреть понятие миграции и причины необходимости миграции
  • изучить структуру миграции
  • ознакомиться с особенностями работы Django с MySQL
  • изучить основные особенности MongoEngine
  • рассмотреть особеннсоти аутентификации в Django
  • ознакомиться с хранением сеанса
  • Страницы:

    Цель лекции: Рассмотреть основные особенности поддерживаемых баз данных; ознакомились со структурой файла миграции; рассмотреть особенности использования Django с NoSQL, реализовали простейший проект MongoDB на Django.

    Ключевые термины: Django, база, фреймворк, файл, SQL, миграция, проект, данные, field, class, url, python, схема, модель, слияние

    Django - это фреймворк с агностическим подходом к базе данных, это означает, что поля базы данных, предоставляемых Django предназначены для работы в разных базах данных, таких как SQLite, Oracle, MySQL и PostgreSQL. Действительно, они также работают с некоторыми сторонними базами данных. PostgreSQL является небольшой базой данных для Django в рабочей фазе, в то время как для окружения разработки используется SQLite, и вы в конечном итоге проделаете много работы, если не захотите использовать СУБД для вашего проекта. Эта лекция даст вам подробную разницу между двумя типами и покажет вам, что лучше подходит для Django, и, так же, как мы действительно можем их имплементировать в наш проект Django.

    Прежде всего, давайте посмотрим на разницу между SQL и NoSQL.

    SQL против NoSQL

    Базы данных SQL и реляционные базы данных использовались повсеместно в течение очень долгого времени; в самом деле, говоря о базах данных, подразумевали базы данных SQL, до тех пор, пока не был придуман новый термин — NoSQL.

    Мы поговорим о высокоуровневых различиях между SQL и NoSQL. Ниже приведены различия между ними:

    SQL база данных (RDBMS) База данных NoSQL
    SQL базы данных являются реляционными базами данных (СУБД) Баз данных NoSQL- нереляционные или распределенные базы данных
    SQL базы данных основаны на таблицах и ее отношения с другими таблицами NoSQL -документальная, пары ключ -значение, графические базы данных или хранение широких столбцов
    База данных SQL хранит свои данные в строках таблицы NoSQL — это коллекция значений пара-ключ документов, графических данных или широкостолбцовых хранилищ
    SQL базы данных имеют предопределенные схемы NoSQL имеет динамическую схему
    Базы данных SQL вертикально масштабируемы Базы данных SQL горизонтально масштабируемы
    Примеры баз данных SQL: MySQL, Oracle, SQLite, PostgreSQL и MS SQL Примеры баз данных NoSQL: MongoDB, BigTable, Redis, RavenDB, Cassandra, HBase, Neo4j и CouchDB

    Давайте попробуем понять основные особенности некоторых из известных баз данных SQL и NoSQL.

    Базы данных SQL

    Следующие разделы посвящены различным SQL базами данных и их использованию.

    MySQL – open source

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

  • Репликация: MySQL поддерживает репликацию, то есть путем репликации базы данных MySQL, рабочая нагрузка может быть значительно уменьшена от одной машины и приложения могут быть легко расширены
  • Сегментирование: Когда количество операций записи очень большое, сегментирование помогает путем разбиения серверного приложения, которое делит базу данных на небольшие куски.
  • PostgreSQL

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

    Развитие расширенных запросов и особенностей PostgresSQL сделали возможным достигнуть комплексной строки обычного запроса SQL в гораздо более простой строке для записи запроса. Однако имплементация массивов, hstore, JSON и так далее сложнее с помощью обычных SQL баз данных.

    NoSQL базы данных

    Эта концепция была введена, когда горизонтальное масштабирование было непросто осуществить и базы данных на основе реляционных СУБД не могли масштабироваться, так как должны были. Часто этот термин расшифровывается Not Only SQL (Не только SQL). Он предоставляет механизм для хранения и извлечения данных, отличных от традиционных методов SQL.

    MongoDB

    MongoDB – одна из самых популярных документальных NoSQL баз данных, так как она хранит данные в JSON-подобных документах. Это нереляционная база данных с динамической схемой. Она была разработана основателями компании DoubleClick. Она написана на C++ и в настоящее время используется в некоторых крупных компаниях, таких как The New York Times, Craigslist и MTV Networks. Ниже приведены некоторые преимущества и сильные стороны MongoDB:

  • Скорость: Для простых запросов, она дает хорошую производительность, так как все данные связаны в единый документ, который убирает операции соединения
  • Масштабируемость: Она горизонтально масштабируемая, то есть, вы можете уменьшить рабочую нагрузку путем увеличения числа серверов в пуле ресурсов вместо того чтобы полагаться на автономный ресурс.
  • Управляемость: Она простая в использовании для разработчиков и администраторов. Это также дает MongoDB возможность совместного использования баз данных.
  • Динамическая схема: Она дает вам гибкость, чтобы развивать вашу схему данных без изменения существующих данных
  • CouchDB

    CouchDB является также документальной базой данных NoSQL. Он хранит данные в виде документов JSON. Ниже приведены некоторые преимущества и сильные стороны CouchDB:

  • Без схемы: будучи членом семейства NoSQL, она также имеет свойство без схемы, которое делает ее более гибким, поскольку у него есть формат документов JSON для хранения данных
  • HTTP-запрос: вы можете получить доступ к вашей документальной базе данных, используя веб-браузер
  • Разрешение конфликтов: Имеется автоматическая система разрешения конфликтов, которая является полезной, когда вы собираетесь использовать распределенную базу данных
  • Легкость репликации: репликация довольно проста
  • Redis

    Redis является еще одной базой данных NoSQL open source, которая используется главным образом в связи с молниеносной скоростью. Она написана на языке ANSI С. Ниже приведены некоторые преимущества и сильные стороны Redis:

  • Структуры данных: Redis обеспечивает до такой степени эффективные структуры данных, что иногда называют как серверные структуры данных. Ключи, хранящиеся в базе данных может быть хэшами, списками и строками и могут быть отсортированным или несортированным набором.
  • Redis в качестве кэша: вы можете использовать Redis в качестве кэша путем имплементации ключей с ограниченным временем для повышения производительности.
  • Очень быстро: Она рассматривается как один из самых быстрых NoSQL серверов, так как она работает с набором данных в памяти.
  • Настройка системы базы данных

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

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

    В отличие от клиент-серверных систем баз данных SQLite не требуют резидентных процессов в памяти и база данных хранится в одном файле, что делает его идеальным для нашего окружения разработки.

    Вот почему мы использовали до сих пор эту базу данных на протяжении всего этого проекта.Конечно, вы можете использовать свою любимую СУБД. Мы можем указать Django, какую СУБД использовать путем редактирования файла конфигурации. Стоит также отметить, что, если вы хотите использовать MySQL, вам будет нужно установить MySQL, которая является драйвером MySQL для Python.

    Установка системы базы данных в Django очень проста; все, что вам нужно сделать, это, во-первых, установить базу данных, которую вы хотите настроить, а затем добавить несколько строк конфигурации в файле settings.py и установка базы данных будет завершена.

    Настройка MySQL

    Мы установим и настроим MySQL связанные с ним плагины шаг за шагом в следующих разделах.

    Установка MySQL в Linux - Debian

    Выполните следующую команду для установки MySQL в Linux (Debian):

    sudo apt-get install mysql-server 

    После выполнения этой команды, вам будет предложено установить MySQL и настроить базу данных с помощью имени пользователя и пароля.

    Установка плагина MySQL для Python

    Для установки плагинов MySQL, которые вам требуются, используйте команду:

    pip install mysql-python

    Теперь откройте файл settings.py и добавьте следующие строки для соединения Django с MySQL:

    DATABASES = {
    'default':	{
    'ENGINE':	'django.db.backends.mysql',
    'NAME':	'django_db',
    'USER': 'your_username',
    'PASSWORD':	'your_password',
    }
    }
    

    Вот и все, то, вам нужно сделать сейчас, это воссоздать все таблицы в новой базе данных, которую вы просто настроили и выполните следующую команду:

    python manage.py syncdb

    Вы получите исключение django.db.utils.ConnectionDoesNotExist, если не определена база данных, к которой вы пытаетесь получить доступ

    Преимуществом Django является, что вы можете использовать его с несколькими базами данных одновременно. Однако вы можете задуматься, какова необходимость использовать несколько баз данных в одном проекте?

    До тех пор, пока баз данных NoSQL не существовало, в большинстве случаев, одна и та же база данных часто используется для учета всех типов данных, от критически важных данных, например, данные пользователя, до дампов данных, таких как журналы; все находились в той же базе данных и системы сталкивались с проблемами во время масштабирования системы.

    Для системы с несколькими базами данных может быть идеальным решением хранить реляционную информацию, например пользователей,их роль и другую учетную информацию, в базе данных SQL, такой как MySQL. Данные приложений, которые является независимыми, могут храниться в базе данных NoSQL, такой как MongoDB.

    Нам необходимо определить несколько баз данных через файл конфигурации. Django необходимо указать, когда вы хотите использовать более чем одну базу данных с серверами базы данных, которые вы используете. Так, в файле settings.py, вам нужно изменить настройку DATABASE с отображением псевдонимов базы данных.

    Соответствующий пример конфигурации нескольких баз данных может быть записан следующим образом:

    DATABASES = {
     'default':	{
    'NAME':	'app_data',
    'ENGINE':	'django.db.backends.postgresql_psycopg2',
    'USER':	'postgres_user',
    'PASSWORD':	's3krit'
    }
    'users': {
    'NAME':	'user_data',
    'ENGINE' :	'django.db.backends.mysql',
    'USER':	'mysql_user',
    'PASSWORD':	'priv4te'
    }
    }
    

    В предыдущем примере используется две базы данных, е MySQL и PostgreSQL с требуемыми учетными данными.

    Миграция и потребность в миграции

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

    Схема миграции с Django имеет длительную и сложную историю; за последние несколько лет единственным выбором было стороннее приложение South. Если вы думаете о важности миграции, Django 1.7 был выпущен с встроенной поддержкой миграции.

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

    Шаги South Миграция Django
    Начальная миграция Запустите syncdb а затем /manage.py schemamigration <appname> --initial ./manage.py makemigrations <appname>
    Миграция применения ./manage.py migrate <appname> ./manage.py migrate <appname>
    Не первая миграция ./manage.py schemamigration <appname> --auto ./manage.py makemigration <appname>

    Таким образом, как мы можем видеть из таблицы, что миграция Django в основном следует тому же процессу, что и South, по крайней мере для стандартного процесса миграции — это немного упрощает дело.

    Новые возможности миграции Django

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

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

  • Улучшенная формат миграции: значительно улучшенный формат миграции читаемый и можно таким образом оптимизировать или проверить его без фактического исполнения
  • Перемещение: Нет необходимости держать или выполнять всю историю миграции каждый раз, тогда как возможно создавать новые первые миграции по мере развития проекта
  • Улучшено автоматическое обнаружение: Изменения новых и пользовательских полей обнаруживаются более легко, так как миграция построена в улучшенном поле API
  • Лучше обнаружение слияний: новый формат миграции будет автоматически разрешать слияние между различными ветвями VCS, которые больше не будет нужны в работе, если мы способны к слиянию изменений.
  • После того, как мы настроим проект и запустить приложение, ваше приложение создаст необходимые таблицы в базе данных, вы не должны делать сложные изменения моделей Django, то есть, вам не следует удалять атрибуты из класса. Однако практически, это не возможно, так как вам может потребоваться изменить ваши классы моделей соответственно. В таких случаях у нас есть решение, чтобы исправить такого рода проблемы. Этот процесс называется миграцией, и, в Django, эти миграции выполняются с помощью модуля South.

    До версии Django 1.8.4, которая является последней, необходимо было отдельно устанавливать модуль South. Однако начиная с миграции версии Django 1.7, модуль South встроен в систему. Вы могли всегда делать это, например, когда вы изменили (изменения, такие как добавление новых атрибутов) ваши классы моделей, используя следующую команду:

    python manage.py syncdb

    В новой версии manage.py syncdb была признана устаревшей для миграции, но, если вы все еще хотите использовать старый способ, он работает.

    Поддержка внутреннего интерфейса

    Очень важно получить поддержку миграции для любого приложения Django, которое используется в рабочей фазе. Таким образом выбор базы данных которая изначально поддерживается модулем миграции, будет всегда лучшим решением

    Некоторые из наиболее совместимых баз данных являются следующими:

  • PostgreSQL: Что касается условий миграции или схемы поддержки, PostgresSQL наиболее совместимая база данных из всех.

    Вы можете инициализировать новый столбец значением null = True, так он будет добавлен гораздо быстрее.

  • MySQL: MySQL -широко используемая база данных, так как Django поддерживает его бесшовно. Подвох в том, что здесь нет поддержки транзакций, когда операции изменения схемы, завершены, и, если операция не удалась, вам придется вручную откатить изменения. Кроме того, для каждого обновления схемы, переопределяются все таблицы, это может занять много времени, и запуск вашего приложения тоже может занять много времени.
  • SQLite: Это база данных по умолчанию, которая поставляется с Django и используется в основном для целей разработки . Таким образом она имеет мало изменения схемы поддержки, только в следующих случаях:
  • Создание новой таблицы
  • Копирование данных
  • Удаление старой таблицы
  • Переименование таблицы
  • Как сделать миграции?

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

  • makemigrations: Основано на изменениях, внесенных в модели, которая готовит запрос миграции
  • migrate: Применяет изменения, подготовленные запросом makemigrations и выводит их статус
  • sqlmigrate: Отображает запрос SQL, который подготовил запрос makemigrations.
  • Таким образом поток для схемы миграции Django может быть сформулирован следующим образом:

    python manage.py makemigrations ‘appname’

    Это подготовит файл миграции, который будет выглядеть аналогично следующему:

    Migrations for 'app_name':
    0003_auto.py:
    - Alter field name on app_name
    

    Затем после того, как файл будет создан, , вы можете проверить структуру каталогов. Вы увидите файл с именем 0003_auto .py в папке миграции; можно применить изменения с помощью следующей команды:

    python manage.py migrate appname 

    Ниже приведены действия, которые необходимо выполнить:

    Synchronize non migrated apps: sessions, admin, messages, auth, staticfiles, contenttypes Apply all migrations: appname Synchronizing apps without migrations:

    Creating tables...
    Installing custom SQL...
    Installing indexes... 
    Installed 0 object(s) from 0 fixture(s)
    Running migrations:
    Applying appname.0003_auto... OK
    

    Сообщение ОК говорит о том, что миграция успешно завершилась.

    Чтобы добавить больше понимания миграции можно объяснить с помощью следующей схемы:

    Существует три отдельных сущности:

  • Исходный код
  • Миграция файлов
  • База данных
  • Разработчик вносит изменения в исходный код, главным образом в файл models.py и изменяет ранее определенную схему. Например, когда они создают новое поле в соответствии с требованиями бизнеса, или обновляют поле max_length с 50 до 100.

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

    Во-первых, мы должны создать начальную миграцию приложения:

     python manage.py makemigrations tweets

    Вывод этой команды следующий:

    Migrations for 'tweet':
    0001_initial.py:
     Create model HashTag
     Create model Tweet
     Add field tweet to hashtag
    

    Это показывает, что первоначальная миграция был создана.

    Давайте теперь изменим нашу модель tweet, которая в настоящее время выглядит следующим образом:

    text = models.CharField(max_length=160, null=False, blank=False)

    Мы изменим предыдущую модель tweet на:

    text = models.CharField(max_length=140, null=False, blank=False)

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

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

    python manage.py makemigrations tweets

    Вывод этой команды следующий:

    Migrations for 'tweets':
    0002_auto_20141215_0808.py:
     Alter field text on tweets
    

    Как вы можете видеть, обнаружено изменение в нашем поле.

    Для проверки мы откроем нашу базы данных SQL и проверим текущую схему нашей таблицы tweet.

    Соединитесь с MySQL с помощью команды::

    mysql -u mysqlusername - pmysqlpassword mytweets

    В консоли MySQL напишите:

    mysql > desc tweettweet; 

    Это покажет вам схему таблицы tweet, следующим образом:

    | Field | Type | Null | Key | Default | Extra |
    +---------------+-------------+--------+-------+-------------------+
    |userid | int(ll) | NO | MUL| NULL	|	|
    |text | varchar(160) | NO |	|NULL |	|
    |created_date | datetime | NO	|	| NULL	|	|
    |country | varchar(30) | NO |	|	NULL	|	|
    | is_active | tinyint(l) | NO |	| NULL |	|
    +---------------+-------------+--------+-------+-------------------+
            6 rows in set (0.00 sec)
    

    Так как мы еще не применили наши миграции, база данных ясно отображает текст в символьном поле в 160 символов:

    text | varchar(160) | NO |	| NULL

    Мы сделаем именно это, как только применим миграции:

    python manage.py migrate tweets

    Далее следуют операции, которые нам нужно выполнить:

    Apply all migrations: tweet
          Running migrations:
    Applying tweet.0002_auto_20141215 0808.. . OK
    

    Наша миграция была успешно применена; давайте проверим то же самое из-под базы данных.

    Чтобы выполнить ту же команду desc MySQL в таблице tweet_tweet, используйте следующую команду:

    MySQL > desc tweettweet;
    
    
    
    
    | Field | Type | Null | Key | Default | Extra |
    +---------------+-------------+--------+-------+-------------------+
    |	userid | int(ll) | NO | MUL	|	NULL	|	|
    |	text | varchar(140) | NO |	|	NULL |	|
    |	created_date | datetime | NO	|	| NULL	|	|
    |	country | varchar(30) | NO |	|	NULL	|	|
    | is_active | tinyint(l) | NO |	| NULL |	|
    +---------------+-------------+--------+-------+-------------------+
            6 rows in set (0.00 sec)
    

    И действительно! Наша миграция была успешно применена:

    |	text | varchar(140) | NO |	|	NULL |	|	

    Как миграции узнают, что требуется подвергнуть миграции

    Django никогда не запускает миграцию более чем один раз на одной и той же базе данных, что означает, что она сохраняет эту информацию. Эта информация управляется таблицей под названием django_migrations, которая создается первый раз, когда запускается приложение Django, и для каждой миграции после этого, вставляется новая строка.

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

    mysql> select * from django_migrations	-+		-+			+	
    	-+		-+			+	
    id	1 app | +	name	| applied |
    		+	+
    i	tweet	1 0001	initial | 2014-12-15 08:02:34 |
    2	tweet -+		1 0002 -+		_auto_20141215_0808 | 2014-12-15 08:13:19 | 	+	
    

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

    Это означает, что даже если вы измените файл миграции вручную, он будет пропущен.

    Это обращает на себя внимание, так как вы не хотите запускать одну и ту же миграцию дважды.

    Конечно, если вы действительно хотите запустить одну и ту же миграцию дважды, то вам следует удалить запись таблицы "THIS IS NOT A OFFICIALLY RECOMMENDED WAY" и все будет прекрасно работать.

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

    Например, если вы наберете следующую команду, все ваши миграции для приложения tweet обратятся:

    python manage.py migrate tweet zero

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

    Файл миграции

    Итак, что же содержит файл миграции, и что действительно происходит при выполнении команды:

    python manage.py migrate tweet

    После ее выполнения, вы можете увидеть каталог migrations, где хранятся файлы миграции. Давайте взглянем на них.. так как это файлы Python, то их можно легко понять.

    Откройте файл tweet/migrations/0001_initial.py, так как это файл, где создан код первоначальной миграции. Он должен выглядеть примерно так:

    # -*- coding: utf-8 -*-
    from  future  import unicode_literals
    from django.db import models, migrations
    class Migration(migrations.Migration): dependencies = [
    ('user_profile',	'first'),
    ]
    operations = [
    migrations.CreateModel( name='HashTag', fields=[
    ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
    ('name', models.CharField(unique=True, max_length=64)),
    3,
    options = {
    },
    bases=(models.Model,),
    ) ,
    migrations.CreateModel( name='Tweet', fields=[
    ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
    ('text', models.CharField(max_length=160)),
    ('created_date', models.DateTimeField(auto_now_add=True)),
    ('country', models.CharField(default=b'Global', max_length=30)),
    ('is_active', models.BooleanField(default=True)),
    ('user', models.ForeignKey(to='user_profile.User')),
    ] ,
    options = {
    },
    bases=(models.Model, ) ,
    ) ,
    migrations.AddField( model_name='hashtag' , name='tweet',
    field=models.ManyToManyField(to='tweet.Tweet'),preserve_default=True,
    ) ,
    }
    

    Для того, чтобы миграция действительно работала, здесь должен быть класс Migration () который наследует от модуля django.db.migrations.Migration. Это основной класс, который используют инструменты миграции, и этот класс миграции содержит два основных списка:

  • Зависимости: Это список других миграций, которые должны быть выполнены перед тем, как эта миграция запустится. В случаях, где есть зависимость, таких как, отношения с внешним ключом, модель внешнего ключа должна существовать прежде самого ключа. В предыдущем случае мы имеет такую зависимость в виде параметра user_profile.
  • Операции: Этот список содержит список миграций, которые должны быть применены, и операция миграции может относиться к одной из следующих категорий:
  • CreateModel: Как понятно из имени, очевидно, что эта операция создает новую модель. В предудущем файле модели вы можете видеть такие строки:
    migrations.CreateModel ( 
    name='HashTag',……
    migrations.CreateModel(
    name='Tweet',……..
    

    Эти строки миграции создают новую модель с определенными атрибутами.

  • DeleteModel: Содержит операторы для удаления модели из базы данных. Противоположно методу CreateModel.
  • RenameModel: Переименовывает модель и дает новое имя взамен старого.
  • AlterModelTable: Изменяет имя связанной с моделью таблицы.
  • AlterUniqueTogether: Уникально ограничивает таблицу, которая изменилась.
  • AltelndexTogether: Изменяет пользовательский набор индексов модели.
  • AddField: Просто добавляет поле к существующей модели.
  • RemoveField: Удаляет поле из модели.
  • RenameField: Переименовывает поле и дает новое имя взамен старого.
  • Схема миграции – не единственное, что требуется для миграции при обновлении приложения; Другой важной вещью являются данные миграции.

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

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

  • Загрузка внешних данных в приложение
  • Когда есть изменение в схеме модели и набор данных нужно обновить
  • Давайте поиграем с нашим проектом, загрузив твит из файла username.txt. Создайте пустую миграцию для нашего проекта, используя следующую команду:

    python manage.py makemigrations --empty tweet

    Это создаст файл миграции mytweets/migrations/003_auto<date_ time_stamp>.py.

    Открыв этот файл, он будет выглядеть следующим образом:

    # -*- coding: utf-8 -*-
    from __future__ import unicode_literals
    
    from django.db import models, migrations
    
    
    class Migration(migrations.Migration):
    
        dependencies = [
            ('tweets', '0002_auto_20150926_1834'),
        ]
    
        operations = [
        ]
    

    Здесь нет ничего, кроме основной структуры инструмента миграции Django, и чтобы организовать миграцию данных, мы должны добавить функцию RunPython () — в операции, как показано:

    #	 -*- coding: utf-8 -*-
    from  future  import unicode_literals
    from django.db import models, migrations
    def load_data(apps, schema_editor):
    Tweet(text= 'This is sample Tweet', created_date=date(2013,11,29), country='India', is_active=True,
    ) .save () 
    class Migration(migrations.Migration):
    dependencies = [
    ('tweet',	'0002_auto_20141215_0808 ' ),
    ]
    operations = [
    migrations.RunPython(load_data)
    ]
    

    Теперь выполним команду migrate:

    python manage.py migrate

    Вот операции, которые вам необходимо выполнить:

    Synchronize unmigrated apps: userprofile
    Apply all migrations: admin, contenttypes, tweet, auth, sessions Synchronizing apps without migrations:
    Creating tables...
    Installing custom SQL...
    Installing indexes...
    Running migrations:
    Applying contenttypes.000linitial... FAKED
     Applying auth.0001initial... FAKED 
    Applying admin.0001initial... FAKED 
    Applying sessions.0001_initial... FAKED
     Applying tweet.0003_auto_20141215_1349 ... OK
    

    После выполнения предыдущей команды, команда мигрировала все приложения и в наконец применила нашу миграцию, в которой мы создали новый твит из загруженных данных:

    mysql> select * from tweettweet;
    +	+	+	+	
    | id | user_id | text | created_date | country | is_active |
    +	+	+	+	
    | 1 | 1 | This Tweet was uploaded from the file. | 2014-12-15 14:17:42 | India | 1 |
    +-----+---------+-------------------------------------------+---------
    2 rows in set (0.00 sec)
    

    Невероятно, правда?

    Этот типа решения очень необходим, когда у вас есть внешние данные в форме JSON или XML-файла.

    Идеальным решением будет использовать аргумент командной строки, чтобы получить путь к файлу и загрузить данные в виде:

    python load data tweet/initial_data.json

    Не забудьте добавить ваши каталоги миграции на Git, так как они так же важны, как и ваш исходный код.

    Django с NoSQL

    Django официально не поддерживает базы данных NoSQL, но имея в запасе такое большое сообщество разработчиков, Джанго имеет форк с MongoDB в качестве внутренней базы данных.

    Для того, чтобы вам продемонстрировать работу, мы будем использовать проект Django-Norel для настройки Django с базой данных MongoDB.

    Вы можете найти подробную информацию об этом на http://django-nonrel.org/.

    MongoDB можно установить, выполнив шаги, указанные на http://docs.mongodb.org/manual/installation/ отталкиваясь от конфигурации, которая у вас есть.

    Сейчас, мы настроим MongoDB для Debian- версии Linux (в частности, Ubuntu).

    Импортируйте открытый ключ GPG MongoDB:

    sudo apt-key adv--keyserver hkp://keyserver.ubuntu.com:80--recv 7F0CEB10

    Создайте файл списка для MongoDB:

    echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist lOgen' | sudo tee /etc/apt/sources.list.d/mongodb.list

    Перезагрузите локальный пакет базы данных:

    sudo apt-get update

    Установите пакеты MongoDB:

    sudo apt-get install -y mongodb-org

    Запустите MongoDB:

    sudo service mongod start

    Проект одностраничного приложения – сокращатель URL-ссылок

    Существует два способа, которыми MongoDB может использоваться совместно c Django, которые заключаются в следующем:

  • MongoEngine: Это Документ-объектное отображение (думается это ORM, но для документальных баз данных), которое используется для работы с MongoDB из-под Python
  • Django-nonrel: Это проект для поддержки Django на нереляционных (NoSQL) базах данных; в настоящее время он поддерживает MongoDB
  • MongoEngine

    Прежде чем двигаться дальше и показать вам, как настроить MongoEngine на совместную работу с Django, нам требуется установка MongoEngine. Установите MongoEngine, введя следующую команду:

    pip install mongoengine

    Для того чтобы защитить предыдущего проект, который мы создали и добиться лучшего понимания, мы создадим отдельный новый проект для конфигурации MongoDB, и мы используем наш существующий проект для настройки MySQL:

    django-admin.py startproject url_shortner
    cd url_shortner
    python manage.py startapp url
    

    Это создаст базовую структуру проекта, как мы очень хорошо знаем.

    Подключение MongoDB совместно с Django

    Нам придется изменить файл, settings.py, и если мы используем только MongoDB для проекта, что верно в данном случае, то мы можем игнорировать стандартный параметр базы данных. Все, что мы должны сделать - вызвать метод connect () на файл settings.py.

    Мы разместим пустой внутренний интерфейс для MongoDB. Просто замените следующий код в файле settings.py, которое выглядит следующим образом:

    DATABASES = {
    'default' : {
    'ENGINE':	'django.db.backends.sqlite3',
    'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
    }
    

    Замените предыдущий код следующим:

    DATABASES = {
    'default' : {
    'ENGINE':	'django.db.backends.dummy'
    }
    }
    

    Аутентификация в Django

    Преимуществом MongoEngine является, что он включает внутренний интерфейс аутентификации Django.

    Модель пользователя становится документом MongoDB и имплементирует большинство методов и атрибутов нормальной модели пользователя Django , что делает MongoEngine совместимым с Django. Мы также можем использовать инфраструктуру аутентификации и декораторов, такие, как методы login_required () и authentication().Модуль auth также содержит метод get_user (), который принимает идентификатор пользователя в качестве аргумента и возвращает объект пользователя.

    Для включения этого внутреннего интерфейса для MongoEngine, добавьте следующую запись в файл settings.py:

    AUTHENTICATION_BACKENDS = (
    'mongoengine.django.auth.MongoEngineBackend',
    )
    

    Хранение сеанса

    В Django можно использовать различные базы данных для хранения сеанса приложения .Чтобы включить сеанс MongoEngine, который хранится в MongoDB, должна быть запись параметра django.contrib.sessions.middleware SessionMiddleware в MlDDLEWARE_CLASSES в файле settings.py. Также должна быть запись о django.contrib.sessions в INSTALLED_APPS, которая уже есть, так как мы начали проект с основной структуры Django.

    Теперь все, что вам нужно сделать это добавить следующую строку в файл settings.py:

    SESSION_ENGINE = 'mongoengine.django.sessions'
    SESSION_SERIALIZER = 'mongoengine.django.sessions.BSONSerializer'
    

    Сейчас мы все настроили для небольшого демонстрационного проекта, где мы имплементируем проект сокращателя URL-адресов на MongoDB.

    Давайте создадим сперва URL-модель, в которой мы будем хранить все длинные и соответствующие им короткие URL-адреса.

    Перейдите к файлу url/models.py:

    from django.db import models 
    from mongoengine import * 
    connect('urlShortener')
    

    Вы уже знакомы с двумя строками предыдущего кода, которые импортирует модули.

    Третья строка, то есть, connect('urlShortener'), соединяет Django с базой данных MongoDB с именем urlShortener.

    MongoDB предоставляет много механизмов подключения, и вы можете выбрать , как, в следующем фрагменте:

    from mongoengine import connect
     connect('project')
    

    Метод, котоый мы используем, принимает MongoDB от порта по умолчанию, которым является 27017; если вы используете MongoDB на другой порту, используйте метод connect() для подключения:

    connect('project1', host='192.168.1.35', port=12345)

    Если вы настроили пароль для MongoDB, можно передать параметры так:

    connect('projectl', username='webapp', password='pwdl23')

    Как и поля модели Django по умолчанию, MongoDB также предоставляет вам различные поля, которые представлены следующими:

  • BinaryField: Это поле используется для хранения необработанных двоичных данных.
  • BooleanField: Это поле логического типа.
  • DateTimeField: Это поле дата-время.
  • ComplexDateTimeField: Это поле высчитывает микросекунды вместо округления их, как это делает DateTimeField.
  • DecimalField: Это поле десятичных чисел с фиксированной точкой.
  • DictField: Это поле словаря, который описывает стандартный словарь Python. Это похоже на внедренный документ, но без определения структуры.
  • DynamicField: Это действительно поле динамического типа, способного обрабатывать различные типы данных.
  • EmailField: Это поле, которое проверяет адрес электронной почты в качестве входных данных.
  • FileField: Это поле для хранения GridFS.
  • FloatField: Это поле числа с плавающей точкой.
  • GeoPointField: Это список, который хранит координаты долготы и широты.
  • ImageField: Это поле для хранения файла изображения.
  • IntField: Это поле 32-разрядного целого числа.
  • ListField: Это поле списка, который оборачивается вокруг стандартного поля, разрешая использовать несколько экземпляров поля в качестве списка в базе данных.
  • MapField: Это поле, которое отображаетимя на выбранный тип поля. Это похоже на DictField, за исключением того, что значение каждого элемента должно соответствовать указанному типу поля.
  • ObjectIdField: это поле, обернутое вокруг идентификатора объекта MongoDB
  • StringField: Это поле строки Юникод.
  • URLField: Это поле проекты проверяет ввод URL-адреса и многое другое.
  • По умолчанию поля не являются обязательными. Чтобы сделать поле обязательным, задайте требуемый ключевой аргумент поля в значение True. Поля также могут иметь ограничения проверки (например, максимальная длина в предыдущем примере). Поля также могут принимать значения по умолчанию, которые будут использоваться, если значение не указано. Значения по умолчанию могут при необходимости быть вызываемыми, которые будут вызываться для получения значения шин (как в предыдущем примере).

    Полный список различных полей можно увидеть на http://docs.mongoengine.org/en/latest/apireference.html.

    Теперь, мы создадим наш класс Url (), который будет похож на другие модели, которые мы создавали раньше, такие как tweets и так далее:

    class Url(Document):
    full_url = URLField(required=True)
    short_url = StringField(max_length=50, primary_key=True, unique=True)
    date = models.DateTimeField(auto_now_add=True)
    

    Давайте взглянем на следующий список терминов:

  • full_url: это поле URL-адреса, который будет хранить полный URL-адрес, и это тот же URL куда будет перенаправлен запрос, когда запрошен его короткий URL-адрес
  • short_url: это короткий URL-адрес для соответствующего длинного URL-адреса
  • date: это будет хранить дату, когда был создан объект Url.
  • Теперь мы двинемся к представлению и создадим два класса:

  • Index: Здесь пользователь может создавать короткие URL-адреса. Он также будет иметь метод post(), который сохраняет каждый длинный URL-адрес.
  • Link: Это контроллер перенаправления короткого URL-адреса. Когда запрашивается короткий URL-адрес, этот контроллер перенаправляет запрос на длинные URL-адреса, такие, как показано в следующем фрагменте кода:
  • class Index(View):
    def get(self, request):
    return render(request, 'base.html')
    def post(self, request): long_url = request.POST[1longurl1] short_id = str(Url.objects.count() + 1) url = Url()
    url.full_url = long_url url.short_url = short_id url.save() params = diet()
    params["short_url"] = short_id
    params['path'] = request.META['HTTP_REFERER']
    return render(request, 'base.html', params)
    

    Давайте взглянем на следующий список терминов:

  • Метод get прост: он перенаправляет запрос на файл base.html (который мы скоро создадим)
  • Метод post () принимает длинный URL-адрес из переменной запроса POST и устанавливает счетчик объекта, так как короткий URL-адрес сохраняет объект URL в базе данных:
  • params['path') = request.META['HTTP_REFERER']

    Это используется для передачи текущего пути представлению, так что короткий URL-адрес могжет быть сделан путем нажатия на тег привязки.

    Здесь показано,как этот URL-адрес объекта сохраняется в DB:

    { "_id"	: ObjectId("548d6ec8e389a24f5ea44258"), "full_url" :
    "http://sample_long_url", "short_url" : "short_url" }
    

    Теперь мы перейдем к классу Link (), который будет принимать запросы коротких URL-адресов и перенаправлять на длинный URL-адрес:

    class Link(View):
    def get(self, request, short_url): url = Url.objects(short_url=short_url) result = url [0]
    return HttpResponseRedirect(result.full_url)
    

    Параметр short_url –это код short_url от запрашиваемого URL-адреса:

    url = Url.objects(short_url=short_url)

    Предыдущая строка запрашивает базу данных для проверки, существует ли соответствующий длинный URL-адрес для данного короткий URL-адреса:

    return HttpResponseRedirect(result.full_url)

    Это перенаправляет запрос, чтобы найти длинный URL-адрес в базе данных.

    Теперь все, что нам нужно для представления, это создать файл base.html.

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

    Код для файла base.html выглядит следующим образом:

    <!DOCTYPE html>
    <html>
    <head lang="en">
    <meta charset="UTF-8">
    <title>URL Shortner</title>
    </head>
    <body>
    <form action="" method="post">
    {% csrf_token %}
    Long Url:<br>
    <textarea rows="3" cols="80" name="longurl"x/textarea>
    <br>
    <input type="submit" value="Get short Url">
    </form>
    <div id="short_url">
    {% if short_url %}
    <span>
    <a href="{{ path }}link/{{ short_url }}" target="_blank">{{ path }}link/{{ short_url }}</a>
    </span>
    {% endif %}
    </div>
    </body>
    </html>
    

    Это отобразит текстовую область с формой, и после отправки формы, покажет короткую ссылку под длинным URL-адресом.

    Чтобы заставить это работать, все, что нам нужно сделать сейчас , это создать требуемое отображение URL-адреса, который является следующим:

    url_shortner/urlmapping.py
    from django.conf.urls import patterns, url 
    from url.views import Index, Link 
    from django.contrib import admin 
    
    admin.autodiscover()
    urlpattems = patterns (' ',
    url(r'^$', Index.as_view()),
    url(r'^link/(\w+)/$', Link.as_view()),
    )
    

    Контрольные вопросы

  • В чем отличие между SQL и NoSQL базами данных?
  • Каким образом осуществляется аутентификация в Django?
  • Каким образом можно использовать MongoDB с Django проектом?
  • Для чего используются схемы миграции?
  • В чем заключается концепция South?
  • Упражнения

    Упражнение 1.

    Дополнить рассмотренный проект MongoDB отправкой ссылки по электронной почте

    Упражнение 2.

    Создайте систему обмена ссылками

    Упражнение 3.

    В виде таблицы оформите какие-либо особенности вышеприведенных баз данных, не рассмотренных в лекции

    Упражнение 4.

    Создать страницу профиля пользователя для сокращателя ссылок

    Список курсовых работ

  • Адаптация прототипа системы модерации твитов под
  • Разработка комплекта пользовательских фильтров и шаблонов для прототипа системы регистрации пользователей
  • Разработка комплекта пользовательских фильтров и шаблонов для продвинутой системы комментирования
  • Разработка комплекта пользовательских фильтров и шаблонов для прототипа системы ведения пользовательских блогов
  • Разработка комплекта пользовательских фильтров и шаблонов для прототипа сервиса мгновенного обмена собщениями
  • Разработка комплекта пользовательских фильтров и шаблонов для прототипа веб-сервиса для хранения изображений
  • Разработка комплекта пользовательских фильтров и шаблонов для прототипа веб-сервиса электронной почты
  • Разработка комплекта пользовательских фильтров и шаблонов для прототипа сервиса для ведения списка ежедневных дел
  • Разработка комплекта пользовательских фильтров и шаблонов для прототипа сервиса для учета рабочего времени
  • Разработка комплекта пользовательских фильтров и шаблонов для приложения для твитов
  • Краткие итоги

  • рассмотреть основные типы баз данных
  • изучить различия между SQL и NoSQL
  • изучить основные особенности разных типов данных
  • рассмотреть особенности настройки MySQL
  • рассмотреть понятие миграции и причины необходимости миграции
  • изучить структуру миграции
  • ознакомиться с особенностями работы Django с MySQL
  • изучить основные особенности MongoEngine
  • рассмотреть особеннсоти аутентификации в Django
  • ознакомиться с хранением сеанса
  • Вернуться к учебному плану