Выполняемые на сервере веб фреймворки

В процессе перевода.

В предыдущей статье было показано, как выглядит общение между веб-клиентами и серверами, характер HTTP-запросов и ответов, а также то, что веб-приложение на стороне сервера должно выполнять, чтобы отвечать на запросы из веб-браузера. Благодаря этим знаниям настало время изучить, как веб-интерфейсы могут упростить эти задачи,
и дать вам представление о том, как выбрать структуру для своего первого веб-приложения на стороне сервера.

Необходимые навыки: Базовая компьютерная грамотность. Высокое понимание того, как серверный код обрабатывает и отвечает на HTTP-запросы (см. Client-Server overview).
Цели: Понять, как веб-интерфейсы  могут упростить разработку / обслуживание кода на стороне сервера и заставить читателей задуматься о выборе структуры для собственной разработки.

Следующие разделы иллюстрируют некоторые моменты, используя фрагменты кода, взятые из реальных веб-интерфейсов . Не беспокойтесь, если не все понятно сразу; мы будем работать с вами над кодом в модулях, посвященных отдельным фреймворкам.

Обзор

Серверные веб-фреймворки (или «фреймворки веб-приложений») - это программные среды, которые упрощают создание, поддержку и масштабирование веб-приложений. Они предоставляют инструменты и библиотеки, которые упрощают общие задачи веб-разработки, включая маршрутизацию URL-адресов для соответствующих обработчиков, взаимодействие с базами данных, поддержку сеансов и авторизацию пользователей, форматирование вывода (например, HTML, JSON, XML) и улучшение защиты от веб-атак.

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

Что может сделать веб-фреймворк для вас ?

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

В этом разделе обсуждается различный функционал, который часто предоставляется веб-фреймворками (но не обязательно каждый фреймворк должен содержать подобный функционал!)

Работайте напрямую с HTTP-запросами и ответами

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

Пример ниже показывает, как это работает в веб-фреймворке Django (Python). Каждая функция «view» (обработчик запроса) получает объект HttpRequest, содержащий информацию о запросе, и должна вернуть объект HttpResponse с форматированным выводом (в этом случае строка).

# Django view function
from django.http import HttpResponse

def index(request):
    # Get an HttpRequest (request)
    # perform operations using information from the request.
    # Return HttpResponse
    return HttpResponse('Output string to return')

Запросы маршрута к соответствующему обработчику

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

Различные фреймворки используют различные механизмы для сопоставления. Например веб-фреймворк Flask (Python) добавляет маршруты для просмотра функций, используюя декораторы.

@app.route("/")
def hello():
    return "Hello World!"

В то время как Django ожидает от разработчиков определения списка сопоставлений URL-адресов между шаблоном URL-адреса и функцией просмотра.

urlpatterns = [
    url(r'^$', views.index),
    # example: /best/myteamname/5/
    url(r'^(?P<team_name>\w.+?)/(?P<team_number>[0-9]+)/$', views.best),
]

Упростите доступ к данным в запросе

Данные могут быть закодированы в HTTP запросе разными способами.  Для получения файлов или данных с сервера, HTTP запрос GET может кодировать какие данные требуются в URL параметрах или в структуре URL. HTTP POST запрос для обновления ресурса на сервере вместо этого будет включать обновленную информацию как "POST данные" внутри тела запроса. HTTP запрос может также включать информацию о текущей сессии или пользователе в cookie со стороны клиента.

Веб-фреймворки предоставляют соответствующие языку программирования механизмы доступа к этой информации. Например, объект HttpRequest, который Django передает каждой функции представления, содержит методы и свойства для доступа к целевому URL, типу запроса (например, HTTP GET), параметрам GET или POST, файлам cookie и данным сеанса и т. д. Django также может передавать информацию, закодированную в структуре URL путем определения «шаблонов захвата» в преобразователе URL (см. последний фрагмент кода в разделе выше).

Абстрагируйте и упростите доступ к базе данных

Веб-сайты используют базы данных для хранения информации как для пользователей, так и о пользователях. Веб-платформы часто предоставляют слой базы данных, который абстрагирует операции чтения, записи, запроса и удаления базы данных. Этот уровень абстракции называется Object-Relational Mapper (ORM).

Использование ORM имеет два преимущества:
 

  • Вы можете заменить базу данных без необходимости изменять код, который ее использует. Это позволяет разработчикам оптимизировать характеристики различных баз данных в зависимости от их использования.
  • Базовая проверка данных может быть реализована. Это позволяет легче и безопаснее проверить, что данные хранятся в правильном поле типа базы данных, имеют правильный формат (например, адрес электронной почты) и не являются вредоносными (взломщики могут использовать определенные шаблоны кода, чтобы сделать такие вещи, как удаление записей базы данных).


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

Первый фрагмент кода ниже показывает очень простую модель Django для объекта Team. Это сохраняет название команды и уровень команды как символьные поля и определяет максимальное количество символов, которое будет сохранено для каждой записи. Team_level - это поле выбора, поэтому мы также предоставляем отображение между вариантами отображения и данными для хранения вместе со значением по умолчанию.

#best/models.py

from django.db import models 

class Team(models.Model): 
    team_name = models.CharField(max_length=40) 

    TEAM_LEVELS = (
        ('U09', 'Under 09s'),
        ('U10', 'Under 10s'),
        ('U11, 'Under 11s'),
        ...  #list our other teams
    )
    team_level = models.CharField(max_length=3,choices=TEAM_LEVELS,default='U11')

Модель Django предоставляет простой API запросов для поиска в базе данных. Это может соответствовать нескольким полям одновременно, используя разные критерии (например, точный, без учета регистра, больше чем и т. Д.), И может поддерживать сложные операторы (например, вы можете указать поиск для команд U11, в которых есть команда имя, которое начинается с «Fr» или заканчивается на «al»).

Второй фрагмент кода показывает функцию представления (обработчик ресурсов) для отображения всех наших команд U09. В этом случае мы указываем, что мы хотим фильтровать для всех записей, где поле team_level имеет в точности текст «U09» (обратите внимание ниже, как этот критерий передается функции filter () в качестве аргумента с именем поля и типом соответствия, разделенными двойным подчеркивания: team_level__exact).

#best/views.py

from django.shortcuts import render
from .models import Team 

def youngest(request):
    list_teams = Team.objects.filter(team_level__exact="U09")
    context = {'youngest_teams': list_teams}
    return render(request, 'best/index.html', context)

Рендеринг данных

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

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

Например, система шаблонов Django позволяет вам задавать переменные с использованием синтаксиса «двойных рулей» (например, { { variable_name } } ), который будет заменен значениями, передаваемыми из функции представления при визуализации страницы. Система шаблонов также обеспечивает поддержку выражений (с синтаксисом: {% expression%}), которые позволяют шаблонам выполнять простые операции, такие как итерация значений списка, передаваемых в шаблон.

Примечание. Многие другие системы шаблонов используют аналогичный синтаксис, например: Jinja2 (Python), handlebars (JavaScript), moustache (JavaScript) и т. д.

Фрагмент кода ниже показывает, как это работает. Продолжая пример «самой молодой команды» из предыдущего раздела, шаблон HTML передает представлению переменную списка youngest_teams. Внутри скелета HTML у нас есть выражение, которое сначала проверяет, существует ли переменная youngest_teams, а затем повторяет ее в цикле for. На каждой итерации шаблон отображает значение team_name команды в элементе списка.

#best/templates/best/index.html

<!DOCTYPE html>
<html lang="en">
<body>

 {% if youngest_teams %}
    <ul>
    {% for team in youngest_teams %}
        <li>{{ team.team_name }}</li>
    {% endfor %}
    </ul>
{% else %}
    <p>No teams are available.</p>
{% endif %}

</body>
</html>

Как выбрать веб-фреймворк

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

Вот некоторые из факторов, которые могут повлиять на ваше решение:

  • Усилия для изучения: усилия по изучению веб-среды зависят от того, насколько вы знакомы с базовым языком программирования, последовательностью его API, качеством документации, а также размером и активностью его сообщества. Если вы начинаете с абсолютно никакого опыта программирования, подумайте о Django (это один из самых простых способов изучения на основе вышеуказанных критериев). Если вы являетесь частью команды разработчиков, которая уже имеет значительный опыт работы с определенной веб-инфраструктурой или языком программирования, то имеет смысл придерживаться этого.
  • Производительность. Производительность - это показатель того, насколько быстро вы можете создавать новые функции, когда вы знакомы с платформой, и включает в себя как усилия по написанию, так и обслуживанию кода (поскольку вы не можете писать новые функции, пока старые не работают). Многие из факторов, влияющих на производительность, аналогичны тем, которые используются для «Усилия по обучению» - например, документация, сообщество, опыт программирования и т. д. - другие факторы включают в себя:
    • Назначение / происхождение фреймворка: Некоторые веб-фреймворки изначально создавались для решения определенных типов проблем и остаются лучше при создании веб-приложений с аналогичными ограничениями. Например, Django был создан для поддержки разработки газетного веб-сайта, поэтому он хорош для блогов и других сайтов, связанных с публикацией материалов. Flask, напротив, является гораздо более легкой средой и отлично подходит для создания веб-приложений, работающих на встроенных устройствах.
    • Мнение против неопознанного. Фракция, основанная на мнении, - это та, в которой рекомендуются «лучшие» способы решения конкретной проблемы. Множество фреймворков, как правило, более продуктивно, когда вы пытаетесь решить общие проблемы, потому что они ведут вас в правильном направлении, однако иногда они менее гибки.
    • Всё включено против разбирайтесь сами: некоторые веб-платформы включают в себя инструменты / библиотеки, которые решают каждую проблему, которую их разработчики могут считать «по умолчанию», в то время как более легкие платформы ожидают, что веб-разработчики будут выбирать решение проблем из отдельных библиотек (например, Django из первых, в то время как Flask является примером очень легкого каркаса). Фреймворки, которые включают в себя все, часто легче начать, потому что у вас уже есть все, что вам нужно, и есть вероятность, что он хорошо интегрирован и хорошо документирован. Однако, если меньший каркас имеет все, что вам (когда-либо) понадобится, он может работать в более стесненных условиях и будет иметь меньший и простой набор вещей для изучения.
    • Независимо от того, поощряет ли платформа хорошие практики разработки: например, структура, которая поощряет архитектуру Model-View-Controller для разделения кода на логические функции, приведет к более поддерживаемому коду, чем тот, который не ожидает разработчиков. Точно так же дизайн фреймворка может оказать большое влияние на то, насколько легко тестировать и повторно использовать код.
  • Производительность фреймворка / языка программирования: обычно «скорость» не является самым большим фактором при выборе, потому что даже относительно медленные среды выполнения, такие как Python, более чем «достаточно хороши» для сайтов среднего размера, работающих на умеренном оборудовании. Воспринимаемые преимущества скорости другого языка, например C ++ или JavaScript вполне могут быть компенсированы затратами на обучение и обслуживание.
  • Поддержка кэширования. По мере того, как ваш сайт становится более успешным, вы можете обнаружить, что он больше не справляется с количеством запросов, которые он получает, когда пользователи получают к нему доступ. На этом этапе вы можете рассмотреть возможность добавления поддержки кеширования. Кэширование - это оптимизация, при которой вы сохраняете весь или часть веб-запроса, чтобы его не нужно было пересчитывать при последующих запросах. Возврат кэшированного запроса гораздо быстрее, чем его вычисление. Кэширование может быть реализовано в вашем коде или на сервере (см. Обратный прокси-сервер). Веб-фреймворки будут иметь разные уровни поддержки для определения того, какой контент можно кэшировать.
  • Масштабируемость. Как только ваш веб-сайт станет фантастически успешным, вы исчерпаете преимущества кэширования и даже достигнете пределов вертикального масштабирования (запуска веб-приложения на более мощном оборудовании). На этом этапе вам может потребоваться масштабировать горизонтально (распределить нагрузку, распределяя ваш сайт между несколькими веб-серверами и базами данных) или масштабировать «географически», потому что некоторые из ваших клиентов находятся далеко от вашего сервера. Веб-фреймворк, который вы выберете, может существенно повлиять на то, насколько легко масштабировать ваш сайт.
  • Веб-безопасность. Некоторые веб-платформы предоставляют лучшую поддержку для обработки распространенных веб-атак. Например, Django очищает весь пользовательский ввод от шаблонов HTML, чтобы пользовательский JavaScript не мог быть запущен. Другие платформы предоставляют аналогичную защиту, но она не всегда включена по умолчанию.

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

Если вы абсолютный новичок в программировании, вы, вероятно, выберете свою среду на основе «простоты обучения». В дополнение к «простоте использования» самого языка, ваши самые ценные ресурсы - это высококачественная документация / учебные пособия и активное сообщество, помогающее новым пользователям. Мы выбрали Django (Python) и Express (Node / JavaScript) для написания наших примеров в дальнейшем в курсе, главным образом потому, что они просты в освоении и имеют хорошую поддержку.

Примечание: давайте перейдем к основным веб-сайтам для Django (Python) и Express (Node / JavaScript) и ознакомимся с их документацией и сообществом.

  1. Перейдите к основным сайтам (ссылка выше)
    • Нажмите на ссылки меню «Документация» (такие вещи, как «Документация, Руководство, Справочник по API, Начало работы»).
    • Можете ли вы увидеть темы, показывающие, как настроить маршрутизацию URL, шаблоны и базы данных / модели?
    • Документы понятны?
  2. Перейдите к спискам рассылки для каждого сайта (доступно по ссылкам сообщества).
    • Сколько вопросов было опубликовано за последние несколько дней
    • У скольких есть ответы.
    • Есть ли у них активное сообщество?

Несколько хороших веб-фреймворков?

Давайте теперь продолжим и обсудим несколько конкретных серверных веб-фреймворков.

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

Примечание: описания приходят (частично) с веб-сайтов фреймворка!

Django (Python)

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

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

Популярные сайты, использующие Django (с домашней страницы Django), включают в себя: Disqus, Instagram, Knight Foundation, MacArthur Foundation, Mozilla, National Geographic, Open Knowledge Foundation, Pinterest, Open Stack.

Flask (Python)

Flask - это микрофрейм для Python.

Хотя Flask минималистичен, он может создавать серьезные веб-сайты из коробки. Он содержит сервер разработки и отладчик, а также поддерживает шаблоны Jinja2, безопасные файлы cookie, модульное тестирование и диспетчеризацию запросов RESTful. У него хорошая документация и активное сообщество.

Flask стал чрезвычайно популярным, особенно для разработчиков, которым необходимо предоставлять веб-сервисы в небольших системах с ограниченными ресурсами (например, запуск веб-сервера на Raspberry Pi, контроллеры Drone и т. Д.)

Express (Node.js/JavaScript)

Express быстрый, непринужденный, гибкий и минималистский веб-интерфейс для Node.js (node - это серверная среда для запуска JavaScript). Он обеспечивает надежный набор функций для веб и мобильных приложений и предоставляет полезные HTTP-утилиты и middleware (промежуточные интерфейсы).

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

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

Многие популярные серверные и полные стеки (включая серверные и клиентские) основаны на Express, включая Feathers, ItemsAPI, KeystoneJS, Kraken, LEAN-STACK, LoopBack, MEAN и Sails.

Многие крупные компании используют Express, в том числе: Uber, Accenture, IBM и т. Д. (Список приведен здесь).

Ruby on Rails (Ruby)

Rails (обычно называемый «Ruby on Rails») - это веб-фреймворк, написанный для языка программирования Ruby.

Rails следует очень похожей философии дизайна на Django. Как и Django, он предоставляет стандартные механизмы для маршрутизации URL, доступа к данным из базы данных, генерации HTML из шаблонов и форматирования данных как JSON или XML. Точно так же поощряется использование шаблонов проектирования, таких как DRY («не повторяйте себя» - пишите код только один раз, если это возможно), MVC (модель-представление-контроллер) и ряд других.

Конечно, есть много различий, связанных с конкретными проектными решениями и характером языков.

Rails использовался для крупных сайтов, в том числе: Basecamp, GitHub, Shopify, Airbnb, Twitch, SoundCloud, Hulu, Zendesk, Square, Highrise.

ASP.NET

ASP.NET - это веб-инфраструктура с открытым исходным кодом, разработанная Microsoft для создания современных веб-приложений и сервисов. С ASP.NET вы можете быстро создавать веб-сайты на основе HTML, CSS и JavaScript, масштабировать их для использования миллионами пользователей и легко добавлять более сложные возможности, такие как веб-API, формы поверх данных или коммуникации в режиме реального времени.

Одним из отличий для ASP.NET является то, что он построен на Common Language Runtime (CLR), что позволяет программистам писать код ASP.NET с использованием любого поддерживаемого языка .NET (C #, Visual Basic и т. д.). Как и многие продукты Microsoft, он обладает отличными инструментами (часто бесплатными), активным сообществом разработчиков и хорошо написанной документацией.

ASP.NET используется Microsoft, Xbox.com, Stack Overflow и многими другими.

Mojolicious (Perl)

Mojolicious - это веб-фреймворк следующего поколения для языка программирования Perl.

Еще в первые дни Интернета многие люди изучали Perl из-за замечательной библиотеки Perl под названием CGI. Это было достаточно просто, чтобы начать, не зная много о языке и достаточно мощный, чтобы держать вас в курсе. Mojolicious реализует эту идею, используя новейшие технологии.

Некоторые из функций, предоставляемых Mojolicious: веб-инфраструктура в режиме реального времени, позволяющая легко превращать отдельные файловые прототипы в хорошо структурированные веб-приложения MVC; RESTful маршруты, плагины, команды, шаблоны Perl-ish, согласование контента, управление сеансами, проверка форм, структура тестирования, статический файловый сервер, обнаружение CGI / PSGI, поддержка Unicode первого класса; Реализация полного стека HTTP и WebSocket клиент / сервер с IPv6, TLS, SNI, IDNA, HTTP / SOCKS5 прокси, сокет домена UNIX, Comet (длинный опрос), поддержка активности, пул соединений, тайм-аут, cookie, поддержка нескольких частей и сжатия gzip; Парсеры и генераторы JSON и HTML / XML с поддержкой селекторов CSS; Очень чистый, портативный и объектно-ориентированный чистый Perl API без скрытой магии; Свежий код, основанный на многолетнем опыте, бесплатный и открытый исходный код.

Резюме

Эта статья показала, что веб-фреймворки могут упростить разработку и поддержку кода на стороне сервера. Он также предоставил общий обзор нескольких популярных платформ и обсудил критерии выбора платформы веб-приложений. Теперь у вас должно быть хотя бы представление о том, как выбрать веб-фреймворк для собственной разработки на стороне сервера. Если нет, то не беспокойтесь - позже в курсе мы дадим вам подробные учебники по Django и Express, чтобы дать вам некоторый опыт работы с веб-фреймворком.

Для следующей статьи в этом модуле мы немного изменим направление и рассмотрим веб-безопасность.

В этом модуле