Содержание
Перевод © Попов Руслан <ruslan.popov • gmail>
В главе «Представления и привязки URL» мы описали основы создания динамических сайтов с помощью Django: настройка представлений и схемы URL для них. Как было рассказано, представление отвечает за некоторую произвольную логику и возвращает отклик. В одном из примеров логикой являлось вычисление текущей даты и времени.
В современных веб-приложениях произвольная логика часто вовлечена в работу с базой данных. Обычно, сайт такого типа подключается к серверу базы данных, получает от него некоторые данные и, выполнив форматирование, отображает эти данные на странице. Так же сайт может предоставлять посетителям сайта возможность заполнять базу данных своими данными.
Множество сложных сайтов предоставляют некую комбинацию этих двух вариантов. Например, http://www.amazon.com/ является отличным примером такого сайта. Каждая страница продукта, по существу, является запросом в базу данных продуктов Amazon, отформатированном в виде HTML. А когда вы отсылаете свой комментарий, он помещается в базу данных отзывов.
Django отлично подходит для создания сайтов, ориентированных на использование совместно с базой данных, т.к., она поставляется с простыми, но мощными механизмами выполнения запросов к базе данных с помощью Python. Эта глава описывает этот механизм: слой Django для работы с базой данных.
Следует отметить, что необязательно знать основы теории баз данных и SQL для использования этого слоя Django, но это крайне рекомендуется. Введение в эти понятия находится вне сферы этой книги. Вероятно, вы сможете понять концепции, учитывая контекст изложения.
Подобно определённому в главе «Представления и привязки URL» «тупому» способу генерации вывода с помощью представлений (вбивание руками текста прямо в код представления), существует «тупой» способ получения в представлениях информации из базы данных. Это просто: используйте любую существующую библиотеку языка Python для выполнения SQL запроса и обрабатывайте его результаты.
В этом примере представления мы используем библиотеку MySQLdb (доступную по адресу http://www.djangoproject.com/r/python-mysql/) для подключения к базе данных MySQL, получения нескольких записей и помещения их в шаблон для отображения на странице сайта:
from django.shortcuts import render_to_response
import MySQLdb
def book_list(request):
db = MySQLdb.connect(user='me', db='mydb', passwd='secret', host='localhost')
cursor = db.cursor()
cursor.execute('SELECT name FROM books ORDER BY name')
names = [row[0] for row in cursor.fetchall()]
db.close()
return render_to_response('book_list.html', {'names': names})
Такой подход работает, но вы должны немедленно столкнуться с некоторыми проблемами:
Мы жёстко определяем параметры соединения с базой данных. В идеале эти параметры должны храниться в конфигурации проекта Django.
Мы должны писать нудный код: создать соединение, создать курсор, выполнить оператор и закрыть соединение. В идеале всё, что мы должны сделать — указать необходимый нам результат.
Это привязывает нас к MySQL. Если, с течением времени, мы решим перейти с MySQL на PostgreSQL, нам потребуется использовать другой драйвер для базы данных (т.е., psycopg вместо MySQLdb), изменить параметры соединения и, в зависимости от природы SQL операторов, возможно, переписать SQL запросы. В идеале, мы должны рассматривать сервер базы данных абстрактно, т.е., для смены сервера мы должны внести изменения в одно только место проекта. (Эта проблема имеет особое значение в случае, если вы работаете над приложением Django с открытым кодом, которое вы желаете распространить среди максимально возможного количества пользователей.)
Как вы можете ожидать, слой Django для работы с базами данных помогает решать такие проблемы. Далее представлен пример как надо изменить предыдущее представление для использования Django API для работы с базами данных:
from django.shortcuts import render_to_response
from mysite.books.models import Book
def book_list(request):
books = Book.objects.order_by('name')
return render_to_response('book_list.html', {'books': books})
Мы разберём этот код немного позже в этой главе.
0 комментариев | Оставьте комментарий