УДК 004.77
Григорьев Е.А. студент
факультет "Информатика и системы управления " Московский государственный технический университет имени. Н.Э. Баумана
Россия, г. Москва
СРАВНЕНИЕ ФУНКЦИОНАЛЬНЫХ ВОЗМОЖНОСТЕЙ И
СТРУКТУРЫ ФРЕЙМВОРКОВ DJANGO И ASP.NET MVC,
РЕАЛИЗУЮЩИХ ПАТТЕРН ПРОГРАММИРОВАНИЯ MVC
Аннотация
В статье рассматривается шаблон программирования MVC (ModelView-Controller), методы его применения, а также приводится сравнительный анализ двух современных и наиболее известных фреймворков, реализующих этот шаблон программирования. Определяется их преимущества и недостатки по сравнению друг с другом. Описываются их основные механизмы, такие как генерация представления на основе шаблона и передаваемых данных, составление маршрута для страниц и подключение к базам данных. А также определяется для каких целях лучше использовать каждый фреймворк.
Ключевые слова: фреймворк, паттерн, СУБД, базы данных, модель, представления, контроллер, url, маршрутизация, язык программирования, запросы, HTTP, данные, HTML.
Grigoryev E.A. student
Faculty of Computer Science and Control Systems Bauman Moscow State Technical University
Russia, Moscow
COMPARISON OF FUNCTIONALITY AND STRUCTURE OF THE DJANGO AND ASP.NET MVC FRAMEWORKS IMPLEMENTING A MVC PROGRAMMING PATTERN
Abstract
The article presents the MVC (Model-View-Controller) programming pattern, methods of its use, as well as the comparative analysis of two modern and most well-known frameworks that implement this programming pattern. It is determined their advantages and disadvantages in comparison with each other. It is described their basic mechanisms, such as generation of the view based on the template and transferred data, route planning for pages and connecting to databases. And also it is determined where there is better for use of each framework.
Keywords: framework, pattern, IMS, database, model, views, controller, url, routing, programming language, queries, HTTP, data, HTML.
1. Введение
Что такое mvc? MVC (Model-View-Controller)- это шаблон программирования, предполагающий разделение обработки веб-приложения на 3 составляющие:
1. Model (модель)
2. View (представление)
3. Controller (контроллер)
Model содержит или представляет данные, с которыми работают пользователи. Они могут быть простыми моделями представлений, которые только представляют данные, передаваемые между представлениями и контроллерами или же они могут быть моделями предметной области, которые содержат бизнес-данные. Модель является посредником между контроллером и различными СУБД, что делает использование всех СУБД одинаково просто.
View является графической частью (интерфейсом) пользователя, например html-страница через которую пользователь зашедший на сайт взаимодействует с ним. Большинство фрэймворков используют свои языки шаблонов (о которых будет рассказано позже) для генерации представлений, которые например позволяют повторно использовать написанный html-код, вызывая его как функцию.
Controller- эта часть, которая отвечает за обработку поступающих от пользователя запросов. Получив запрос, контроллер его анализирует, и в зависимости от результатов обработки может выдать следующие варианты ответа:
• сразу выдать сообщение об ошибке (например в случае если контроллер признал запрашиваемую страницу несуществующей, то он возвращает пользователю HTTP- заголовок "404 Not found")
• если запрос признан корректным, то контроллер вызывает соответствующий метод для генерации представления пользователю
• также если запрос признан корректным, то возможен вызов метода для отправки пользователю не только представления, но и json/xml файлов, которые будут использоваться на пользовательской стороне для изменения представления без полной загрузки представления с сервера
Применения концепции MVC состоит в отделении бизнес-логики от её визуализации, что упрощает повторное использование кода и особенно полезно, если пользователь должен видеть одни и те же данные в различных контекстах и (или) с различных точек зрения одновременно, а также позволяет производит модификацию каждого компонента независимо, что позволяет увеличить скорость разработки веб-приложения.
2. Краткое описание ASP.NET MVC и Django 2.1 Что представляет из себя ASP.NET MVC
ASP.NET MVC [3,4]- это фреймворк, разработанный компанией Microsoft в 2009 году как альтернатива ASP.NET Web Forms, реализующий паттерн MVC. ASP.NET MVC разработан на основе языка
программирования C#, что дает возможность запускать веб-приложения, как на операционных системах Windows на платформе .NET, так и в операционных системах Linux. В настоящее время разрабатывается ASP.NET MVC 6, как часть ASP.NET Core; 27 июня 2016 года состоялся выход версии 1.0.0.
Существующая платформа ASP.NET предлагает зрелый, хорошо проверенный набор компонентов и средств для разработки эффективных и высокопроизводительных веб-приложений. Первое и наиболее очевидное преимущество заключается в том, что поскольку инфраструктура ASP.NET MVC построена на основе платформы .NET, можно писать код на любом языке .NET и при этом иметь доступ к одним и тем же функциям API-интерфейсов, которые определены не только в MVC Framework, но и в обширной библиотеке классов .NET, а также в широком множестве библиотек .NET от независимых разработчиков.
Готовые средства платформы ASP.NET, такие как аутентификация, членство, роли, профили и интернационализация, могут существенно сократить объем кода, который придется писать и поддерживать в любом веб-приложении, и в проекте MVC Framework они столь же эффективны, как в классическом проекте Web Forms. Лежащая в основе платформа ASP.NET предоставляет развитый набор инструментов, на базе которых строятся веб-приложения с помощью MVC Framework.
Основные возможности ASP.NET MVC:
• расширяемость
• жесткий контроль над HTTP и HTML
• тестируемость
• мощная система маршрутизации
• современный API
2.2 Что представляет из себя Django framework
Django [1,2] - это ничто иное, как фреймворк для языка программирования Python, реализующий шаблон MVC, затем лишь исключением, что в отличии от обычного шаблона MVC, где Controller (контроллер) выполняет анализ запросов и генерацией ответов на них, а View (представление) является графической частью, в Django View выполняет роль контроллера, а представления именуются шаблонами (Template). Из-за этого архитектуру Django иногда называют MTV (ModelTemplate-View). Django выпущен в 2003 году некоммерческой организацией Django Software Foundation и является открытым программным обеспечением (на момент написания статьи последней версия фреймворка Django является 1.10.5, вышедшая 4 января 2017).
Одним из ключевых отличий Django от остальных фреймворков, реализующих шаблон MVC является то, что написанное приложение является модульным, то есть состоит из нескольких отчужденных приложений, что позволяет разработчику использовать для создания своих
новых проектах ранее написанные им или кем-то другим приложения, что сильно увеличивает скорость разработки веб-приложений.
Основные возможности Django:
• встроенная "админка" (интерфейс администратора)
• расширяемая система шаблонов с тегами и наследованием
• модульная архитектура приложения
• маршрутизация URL на основе регулярных выражений
• кэширование
3 .Используемые СУБД и средства работы с ними
База данных являются одних из основных компонентов любого сайта, они содержат всю информацию, оставленную пользователями. Без базы данных сайт представлял бы из себя набор статических страниц. Сейчас широко используются реляционные базы данных, использующие стандарт языка SQL для работы с данными.
Популярные СУБД:
• MySQL
• Oracle
• MSSQL
• PostgreSQL
• SQLite
В идеале все современные фреймворки должны уметь взаимодействовать со всеми типами СУБД.
3.1 Работа с базами данных в ASP.NET MVC
Помимо доступа к базе данных, модели в ASP.NET MVC позволяют проводить проверку на корректность данных, переданных пользователем на сервер. Все созданные модели по умолчанию помещаются в папку Models проекта и представляют из себя классы, а созданные базы данных (если такие имеются) помещаются в папку App_Data. Для доступа и работы с базами данных ASP.NET MVC используют технологию ADO.NET Entity Framework.
ADO.NET представляет из себя пространства имен, позволяющих непосредственно взаимодействовать с локальными и удаленными базами данных, которые позволяют писать более-менее одинаковый код для доступа к данным — как в веб-приложениях, так и в клиент-серверных настольных приложениях, и даже в однопользовательских приложениях, подключаемых к локальной базе данных. ASP.NET MVC при подключение к базе данных использует пул соединений, предоставляемый поставщиком данных, что позволяет избежать необходимости в постоянном создании и уничтожении соединений.
ADO.NET по умолчанию использует 4 поставщика данных:
1. OLE DB
2. SQL Server
3. Open Database Connectivity
4. Oracle
Используя OLE DB или Open Database Connectivity можно подключиться практически к базе данных любого типа
ADO.NET можно использовать тремя способами:
1. подключенный режим: в подключаемом режиме открывать и закрывать соединение программисту приходится вручную при помощи объекта Connection. SQL-запросы отправляются при помощи объекта Command кроме того объект команд предоставляет доступ к объекту чтения данных определенного поставщика данных; чтение данных происходит при помощи объекта DataReader; конкретные имена, перечисленных выше объектов различаются в зависимости от поставщиков.
2. автономный режим: автономные типы позволяют эмулировать реляционные данные с помощью модели объектов, находящихся в памяти; кроме простого моделирования табличных данных, состоящих из строк и столбцов, типы из System.Data позволяют воспроизводить отношения между таблицами, ограничения столбцов, первичные ключи, представления и другие примитивы баз данных.
3. Entity Framework (EF): представляет из себя специальную объектно-ориентированную технологию на базе фреймворка .NET для работы с данными, позволяющую взаимодействовать с реляционной БД не имея дело с кодом SQL; данный подход позволяет абстрагироваться от самой базы данных и работать с данными независимо от типа хранилища; данный способ чаще всего используется при написание веб-приложений на ASP.NET
ASP.NET MVC предоставляет 4 варианта для создания модели:
1. конструктор EF из базы данных: шздает модель в конструкторе EF на основе существующей базы данных; можно выбрать подключение к базе данных, параметры для модели и объекты базы данных для включения в модель; классы, с которыми будет взаимодействовать ваше приложение, формируются из этой модели.
2. пустая модель конструктора EF: шздает пустую модель в конструкторе EF в качестве отправной точки для визуального проектирования модели; затем из модели можно будет сформировать базу данных; классы, с которыми будет взаимодействовать ваше приложение, формируются из этой модели.
3. пустая модель Code First: шздает модель Code First в качестве отправной точки для проектирования модели с помощью кода; затем из модели можно будет сформировать базу данных. (вне зависимости от наличия можно вручную написать код классов и свойств, соответствующих сущностям в базе и использовать этот код с Entity Framework без использования файла .edmx)
4. Code First из базы данных: шздает модель Code First на основе существующей базы данных; можно выбрать подключение к базе данных, параметры для модели и объекты базы данных для включения в модель.
3.2. Работа с базами данных в Django
Для работы с базами данных Django использует механизм Django ORM, который предоставляет простой механизм работы с базой без изучения синтаксиса SQL запросов. Однако подобное абстрагирование может привести к неэффективному использованию БД. Модели в Django. Модели в Django хранятся в файле models.py и представляют из себя классы на языке Python.
Основные идеи Django ORM:
• таблицы в БД описываются Python классами, в которых описаны все атрибуты
• выполнение запроса к БД - это вызов методов данного класса
• каждая запись в таблице - объект данного класса
• автоматическая генерация миграций (создание таблиц и связей между ними в базе данных на основе классов из модели)
Django использует постоянные соединения с базой данных, что улучшает производительность, позволяя не создавать новое подключение к базе данных при каждом запросе. У постоянного соединения есть время жизни, хранящиеся в настройке CONN_MAX_AGE. При первом запросе Django выполняет подключение к базе данных и держит соединение открытым до истечения значения CONN_MAX_AGE, при каждом запросе Django проверяет не истекло ли время жизни и если оно истекло, то Django закрывает соединение и устанавливает новое. В конце каждого запроса Django закрывает соединение, если истек его срок, или, если соединение находится в состоянии неисправимой ошибки. Если в процессе обработки запроса произошла ошибка базы данных, Django проверяет работает ли соединение, и закрывает его, если оно не работает. Таким образом ошибка базы данных влияет только на один запрос, для последующих запросов будет создано новое соединение.
СУБД , поддерживаемые Django:
1. MySQL
2. SQLite
3. PostgreSQL
4. Oracle
4. Routing (Маршрутизация)
Одной из главных задач серверной стороны сайта является определение по переданному URL действий, которые необходимо выполнить, именно этим и занимается маршрутизация
4.1 Маршрутизация в ASP.NET MVC
В веб-приложении на ASP.NET MVC может быть сразу несколько контроллеров, по этой причине URL запроса к серверу выглядит, как "/контроллер/метод?параметры".
Шаблон маршрутов веб-приложения хранится в файле App_Start/RouteConfig.cs.
Функции системы маршрутизации:
1. обработка входящего URL и определение какому контроллеру и методу он соответствует, сопоставляя его с шаблоном
2. генерация исходящих URL
Контроллер представляет из себя класс, унаследованный от класса
Controller
пример:
using System.Web.Mvc;
namespace ASP_test.Controllers
{
public class HomeController : Controller
{
public ActionResult Index() {
return View(); //передача представления
}
}
}
в результате к этому контроллеру будут обращаться по имени Home.
Шаблон маршрутов представляет из себя класс RouteConfig и может содержать сразу несколько маршрутов, которые регистрируются методом RegisterRoutes.
Система маршрутизации пытается сопоставить входящий URL с шаблоном маршрута, который был определен первым, и продолжает сопоставление со следующим маршрутом, только если соответствие не найдено. Маршруты выбираются последовательно, пока не обнаружится соответствие или не исчерпается набор маршрутов. В результате мы должны определять более специфичные маршруты первыми.
Выше говорилось, что URL запроса имеет вид "/контроллер/метод?параметры", но на самом деле эту структуру можно изменять по желанию, изменяя настройки маршрутов в шаблоне, например:
• можно установить значения контроллеров их методов по умолчанию, то есть если механизм маршрутизации не найдет названия метода в URL, то он подставит значение, прописанное по умолчание, то же касается случая, когда не указаны имя контроллера и имя метода (если указано имя метода, но не указано имя контроллера, то в этом случае будет ошибка маршрутизации)
• можно использовать статические сегменты URL, в самом простом виде, это выглядит, как приписывание статического значения к строке, генерируемой из имен контроллеров и их методов
• можно определять необязательные сегменты URL
• можно определять маршруты переменной длины
• можно создавать псевдоним для для переменных сегментов, то есть
разработчик может комбинировать статические сегменты URL и стандартные значения для создания псевдонима специфического URL
• Можно назначать приоритеты контроллерам с помощью пространства имен, применяется когда в двух разных пространствах имен есть контроллеры с одинаковыми именами
4.2 Маршрутизация в Django Для задания маршрута в Django используются шаблоны, заданные регулярными выражениями. Все маршруты хранятся в файле urls.py. Алгоритм обработки запросов в Django:
1. Django определяет какой корневой модуль URL conf использовать
2. Django загружает модуль конфигурации URL и ищет переменную urlpatterns; это должен быть список экземпляров dj ango. conf.urls.url()
3. Django перебирает каждый URL-шаблон по порядку, и останавливается при первом совпадении с запрошенным URL-ом.
4. если одно из регулярных выражений соответствует URL-у, Django импортирует и вызывает соответствующее представление, которое является просто функцией Ру^^или представление-класс)
5. если ни одно регулярное выражение не соответствует, или возникла ошибка на любом из этапов, Django вызывает соответствующий обработчик ошибок
Пример конфигурации URL: from django.conf.urls import url from . import views urlpatterns = patterns('', url(r'Aadmin/', include(admin.site.urls)),
url(r'A', include('newsModule.urls')) )
Возможности шаблонов:
• установка значений по умолчанию для аргументов представления
• комбинирование URLconfs. Так как веб-приложение на Django в основном состоит из нескольких модулей, то каждый модуль может содержать свой шаблон для анализа URL, при помощи комбинирования, можно при обнаружение в URL определенного паттерна он отправляется для дальнейшей обработки в другой модуль, что делает модули независимыми и позволяет легко добавлять в свое веб-приложение сторонние модули (в качестве примера можно привести Django-админку)
• вложенные аргументы; используя вложенные аргументы можно передавать их в представление
• передача необязательных аргументов
• именования URL-шаблона; строка, использованная для наименования URL, может содержать любые символы; не ограниченичивается только теми именами, что позволяет Python.
5. Контроллеры
Контроллеры являются главной частью веб-приложения, построенного на шаблоне MVC. Именно контроллер содержит все методы, которые может выполнять веб-приложение для взаимодействия с пользователем
5.1. Контроллеры в ASP.NET MVC
Контроллер в ASP.NET MVC представляет собой класс, методы которого возвращают объект класса ActionResult или ничего не возвращают (в случае когда для генерации ответа использую объект Response). Контроллер можно создать двумя способами:
1. создать класс, реализующий интерфейс IContrller
2. создать класс, унаследованный от класса Controller
Контроллеру передаются данные из входящего запроса для их
дальнейшей обработки, в ASP.Net предусмотрены следующие способы их получения:
• получение параметров, как аргументов метода
• через средство привязки моделей (переданные параметры можно попытаться отобразить на модель, часто используют для валидации, переданных данных)
• извлечение из объектов контекста (например из объекта Request, к которому можно обратиться в методе контроллера)
Возможно назначения получаемым параметрам значение по умолчанию, что может позволить избежать ошибки при анализе, полученных параметров.
Обычно каждый метод контроллера в конце работы генерирует ответ, будь то html страница или json файл. В ASP.NET MVC предусмотрено несколько возможностей генерации ответа:
• вручную при помощи объекта Response; такой метод более сложен, но дает разработчику больший контроль над генерацией ответа.
• результаты действий - методы действий возвращают объект класса, производного от ActionResult, который описывает, каким должен быть ответ из контроллера.
Для генерации самого распространенного ответа, а именно HTML-страницы контроллеры должны уметь искать, какое представление будет применено, для генерации страницы. Если для генерации ответа используется объект Response, то разработчику придется вручную прописывать, как будет выглядит HTML страница, а если использовать метод с ActionResult, то можно воспользоваться движком представлений Razor и есть несколько методов, как можно указать Razor^ какое представление использовать:
• передать имя представления
• передать путь к представлению
• ничего не передавать, но тогда Razor будет искать представление, имеющее такое же имя, что и метод
Для генерации HTML-страницы контроллер может передавать давать данные несколькими способами:
• через ViewData; представляет словарь из пар ключ-значение
• через ViewBag; представляет из себя объект, где все переданные параметры являются его свойствами
• через TempData; является словарем, как ViewData, но позволяет сохранять переданное значение в течении всего текущего запроса, пока это значение не будет извлечено.
• через модель представления
Для усложнения логики приложения ASP.NET MVC предоставляет возможность блокировать некоторые методы по определенным условиям. Например некоторые методы доступны только авторизированным пользователям или некоторые методы могут принимать только POST запросы
5.2. Контроллеры в Django
Заранее стоит повторить, что в Django используется термин представление для методов представлений, а контроллер представляет из себя просто набор этих методов, а н еклас, как в ASP.NET MVC. В рамках следующего пункта методы контроллеров будут именоваться, как представления, чтобы не было рассогласований с документацией Djando. В следующих пунктах этот термин будет использоваться в отношении шаблонов для генерации HTML-страниц.
Любой вызываемый объект языка Python может быть представлением. Единственное требование в том, что объект должен принимать объект запроса в качестве первого аргумента (обычно этот параметр так и именуют — request). Обычно контроллер в Django представляет из себя файл Views.py, в котором хранится набор вызываемых методов. Все данные для анализа представления получают из переданного им объекта запроса.
В Dajngo есть 2 типа представлений:
1. CBV (class based views); позволяет описывать контроллеры не как обычно в виде набора функций, а как класс, что позволяет повторно их использовать при создании новых контроллеров путем наследования.
2. обычные функции принимающие объект запроса
Все данные из запроса получается через методы объекта request, переданного представлению. Можно получить такие данные, как:
• полный путь
• имя компьютера
• данные, переданные POST запросом
• данные, переданные GET запросом
• Cookie
• и др
Для генерации ответа в Django используется объект HttpResponse, JsonResponse (для передачи json-файлов) и StreamingHttpResponse (для
ответов больших размеров), у HttpResponse множество вариантов использования, вот некоторые из них:
• передача строки, используется для передачи текста страницы
• передача итератора
• установка заголовков
• можно указать браузеру воспринимать ответ, как вложенный файл
В Django для генерации из шаблона HTML-страницы и передачи ее
пользователю используется метод render_to_response, так же при помощи этой функции в шаблон для его генерации передаются данные
6. Представления
Представления являются частью веб-приложения, через которое пользователь с ним взаимодействует. В Django и в ASP.NET MVC используются свои языки шаблонов, которые позволяют генерировать HTML-страницу
6.1. Представления в ASP.NET MVC
ASP.NET MVC в качестве представлений использует файл с расширением .cshtml, который выглядит, как обычная HTML-страница со вставками кода на С#, но на самом деле не является HTML-страницей, при компиляции проекта на основе этого файла генерируется и затем компилируется класс.
Для составления представлений в ASP.NET MVC используется движок представлений Razor. Используя Razor можно вставлять в HTML-верстку код на С#, ставя перед ним символ @.
Возможности движка Razor:
• использование переданных от котроллера данных для генерации страницы; движок Razor позволяет обращаться к переданным данным и использовать их в любом месте представления
• использование стандартных классов и методов (например DateTime)
• использование циклов для генерации представления
пример:
@foreach(var user in Model)
{
<img [email protected]> <br>
}
• позволяет вводить новые переменные и использовать их для генерации представления
• использование строго типизированных представлений; позволяет использовать данные переданные напрямую в представление через параметр метода View
• использование мастер-страниц; это такие представления, которые позволяют встраивать в них другие представления; очень удобно
использовать для описания общего вида всех страниц сайта, что позволяет не писать один и тот же код несколько раз (самым частым проявлением мастер-страниц можно назвать "шапку" страницы)
• использование HTML-хелперов; это инструменты для генерации HTML-кода и похожи на методы на языке C#; HTML-хелперы удобно использовать, если необходимо создать один метод, который предполагается использовать в представлении многократно; HTML-хелперы можно как объявлять в коде одного представления, так и выносить их в отдельные .cshtml файлы; по умолчанию в ASP.NET MVC уже есть набор стандартных HTML-хелперов, например, для создания формы; cуществуют так называемые строго типизированные хелперы, это такой вид хелперов, который принимает в качестве параметра лямбда-выражение, в котором указывается то свойство модели, к которому должен быть привязан данный хелпер.
6.2. Представления в Django
В Django для генерации представления (в Django представления называются шаблонами) используется свой язык шаблонов. Представление является тестовым файлом, на основе которого генерируется возвращаемая пользователю страница.
Возможности языка шаблонов:
• использование переменных; при нахождении переменной вида {{ variable }} шаблон вычисляет ее и заменяет результатом
• использование фильтров к переменной; фильтры- это некоторое действие, которое применяется к переменной (например назначение значения по умолчанию или возврат размера значения) переменная с фильтром выглядит примерно так {{value | length}}
• использование тегов; теги- это конструкции, такие как циклы, условные переходы и тд, которые позволяют вводить логику при генерации представления
• наследование представлений; это конструкции, позволяющие создавать представление-каркас, который содержит базовые элементы сайта и определяет блоки, которые могут быть переопределены дочерними шаблонами.
• автоматическое экранирование HTML; это механизм, который позволяет автоматически избежать xss уязвимостей.
• вызов методов.
7. Заключение
В данной статьи не были рассмотрены такие механизмы этих фреймворков, как авторизация, аутентификация и сессии по той причине, что различий в их использовании и в функциональности в этих двух фреймворков особых нет.
Из всего выше написанного можно сделать вывод, что шаблон MVC является очень удобным в использовании и простым в понимании.
Фреймворк ASP.NET MVC по сравнению с фрейворком Django более функциональный и удобный в разработке из-за наличия удобной IDE, но более сложный в освоении, чем Django.
Django очень прост в освоении и в использовании, и позволяет использовать при разработке веб-приложений модули написанные другими людьми без особых проблем (нужно отметить, что по опыту автора сообщество программистов, использующих Django является более активным и отзывчивым), но к сожалению Django пока не способен поддерживать все СУБД.
ASP.NET MVC следует использовать в крупных проектах из-за его большей функциональности.
Django следует использовать когда требуется скорость разработки проекта и проект не очень сложный
Использованные источники:
1. Официальный сайт разработчиков Django [Электронный ресурс] - режим доступа: https://www.diangoproiect.com (дата обращения 15.03.2017).
2. Официальная документация на русском языке по Django [Электронный ресурс] - режим доступа: https://dibook.ru _(дата обращения 15.03.2017).
3. Онлайн книга Электронный ресурс] - режим доступа: https://metanit.com/sharp/mvc/ https://djbook.ru _(дата обращения 15.03.2017).
4. Microsoft MSDN [Электронный ресурс] - режим доступа: https://msdn.microsoft.com (дата обращения 15.03.2017).