Российский Новый Университет
Опубликован: 25.01.2016 | Доступ: свободный | Студентов: 2235 / 161 | Длительность: 16:40:00
Лекция 11:

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

Метод, котоый мы используем, принимает 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()),
)

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

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

Упражнения

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

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

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

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

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

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

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

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

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

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

Краткие итоги

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

Вроде легкие вопросы и ответы знаю правильные, но система считает иначе и правильные ответысчитает неправильными. Приходится выполнть по несколько раз. Это я не правильно делаю или тест так составлен?

Владимир Филипенко
Владимир Филипенко

Листинг показывает в 4-ой лекции, что установлен Django 1.8.4. Тут же далее в этой лекции указаны настройки, которые воспринимает Django 1.7 и младше.