Yesod (веб-фреймворк) - Yesod (web framework)

Йесод
Оригинальный автор (ы)Майкл Снойман
Разработчики)Майкл Снойман и др.
изначальный выпуск2010
Стабильный выпуск
1.6.18[1] / 2020-05-31[±]
Репозиторий Отредактируйте это в Викиданных
Написано вHaskell
Операционная системаКроссплатформенность
Доступно вHaskell
ТипВеб-фреймворк
ЛицензияЛицензия MIT
Интернет сайтwww.yesodweb.com Отредактируйте это в Викиданных

Йесод (IPA:[je'sod]; ивритיְסוֺד, «Фундамент») является бесплатно и с открытым исходным кодом веб-фреймворк на основе Haskell для продуктивной разработки типобезопасных, ОТДЫХ на основе модели (где URL определить ресурсы и HTTP методы определения переходов), высокопроизводительные веб-приложения, разработанные Майкл Снойман и другие.

Yesod основан на шаблонах для создания экземпляров для перечисленных сущностей и функций обработки динамического контента с помощью Шаблон Haskell конструкции для размещения eDSL шаблоны содержимого, называемые QuasiQuotes, где содержимое переводится в выражения кода с помощью метапрограммирование инструкции.[2]

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

Yesod разделяет свои функции на отдельные библиотеки, поэтому вы можете выбрать свою {базу данных, рендеринг HTML, формы и т. Д.} Функциональную библиотеку по своему усмотрению.

Архитектура MVC

Контроллер

Серверный интерфейс

Йесод использует Интерфейс веб-приложения API,[4] сокращенный WAI, изолировать сервлеты, он же веб-приложения., с серверов, с обработчиками для серверных протоколов CGI,[5] FastCGI,[6] SCGI,[7] Деформация,[8] Запуск (открыт как местный URL в браузер по умолчанию, закрывая сервер при закрытии окна),[9]

В Фонд тип

См. Исх.[10] Yesod требует тип данных, который создает экземпляр контролер классы. Это называется Фонд тип. В приведенном ниже примере оно называется «MyApp».

В ОТДЫХ модель идентифицирует веб-ресурс с веб-путем. Здесь ОТДЫХ Ресурсы получают имена с суффиксом R (например, "HomeR") и перечислены в parseRoutes шаблон описания карты сайта. Из этого списка берутся имена маршрутов и имена обработчиков диспетчеризации.

Йесод использует Шаблон Haskell метапрограммирование для генерации кода из шаблонов во время компиляции, обеспечение совпадения имен в шаблонах и проверки всех типов (например, имен веб-ресурсов и имен обработчиков).

Вставив mkYesod позвони, это позвонит Шаблон Haskell примитивы для генерации кода[11] соответствующие членам типа маршрута, и экземпляры классов диспетчерского контроллера для диспетчеризации ПОЛУЧАТЬ звонки по маршруту HomeR в подпрограмму с именем, составляющим их обе как «getHomeR», ожидая существующего обработчика, который соответствует имени.

Привет, мир

Пример "Привет, мир" на основе CGI интерфейс сервера (фактические типы обработчиков изменились, но философия осталась):

{- файл wai-cgi-hello.hs -}{- # LANGUAGE PackageImports, TypeFamilies, QuasiQuotes, MultiParamTypeClasses,             TemplateHaskell, OverloadedStrings # -}импорт "вай" Network.Waiимпорт "вай-экстра" Network.Wai.Handler.CGI (пробег) - сменный обработчик WAIимпорт "йесод" Йесодимпорт "yesod-core" Йесод. Обработчик (getRequest)импорт "текст" Data.Text (Текст)импорт "шекспир" Текст. Кассий (Цвет(..), черный цвет)- тип фундаментаданные MyApp = MyApp- шаблон карты сайта, путь к списку, имя ресурса и принятые методы- `mkYesod` принимает имя типа фундамента как параметр. для именного состава диспетчерских функцийmkYesod «Мое приложение» [parseRoutes|/ HomeR ПОЛУЧАТЬ|]пример Йесод MyApp- шаблон CSS с отступамимой стиль :: [Текст]  CssUrl urlмой стиль paramStyle =        [кассий|.коробка    граница: 1px твердый #{boxColor}|]        куда          boxColor = дело paramStyle из                        ["высокий контраст"]  черный цвет                        _  Цвет 0 0 255- HTML-шаблон структурированного отступаmyHtml :: [(Текст, Текст)]  HtmlUrl urlmyHtml параметры = [Гамлет|
$' префикс)      описать древовидную структуру содержимого или последовательности ->#'префиксы в тегах вводят значения атрибутов "class" или "id" в стиле css ->#{expr} синтаксис -><п>Привет, мир! Есть <охватывать .коробка>#{длина params} параметры</охватывать>:$если нулевые параметры <п>Ничего не перечислить $еще    <ул>         $для всех парам <- параметры             <Ли>#{первый param}: #{snd param} |]
getHomeR :: Обработчик RepHtmlgetHomeR = делать        req <- getRequest        позволять параметры = reqGetParams req        paramStyle <- lookupGetParams "стиль"                defaultLayout $ делать            - добавление виджетов в монаду Widget (монада Writer)            setTitle «Пример Йесод»            toWidgetHead $ мой стиль paramStyle            toWidgetBody $ myHtml параметры- есть варианты функции run для разных обработчиков WAIглавный = toWaiApp MyApp >>= пробег
# cgi testэкспорт REMOTE_ADDR=127.0.0.1экспорт REQUEST_METHOD=ПОЛУЧАТЬэкспорт PATH_INFO=/экспорт СТРОКА ЗАПРОСА='p1 = abc; p2 ​​= def; style = высококонтрастный'./wai-cgi-hello

[10]

Ресурсы, маршруты и обработчики HTTP-методов

См. Исх.[12][13] Йесод следует за Изобразительное State Transfer модель доступа к веб-документам, идентифицирующая документы. и каталоги как ресурсы с конструктором маршрута, названным с суффиксом R в верхнем регистре (например, HomeR).

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

Возможен захват сегмента URL в качестве параметра, указав префикс «#» для захвата одного сегмента или «*» для захвата нескольких сегментов, за которым следует тип параметра.

- учитывая тип основания MyAppmkYesod «Мое приложение» [parseRoutes|/                     HomeR      - не указаны методы http: принимаются все методы/блог                 BlogR      ПОЛУЧАТЬ ПОЧТОВЫЙ- префикс '#' указывает сегмент пути как параметр обработчика маршрута/статья/#ArticleId   СтатьяR   ПОЛУЧАТЬ ПОЛОЖИТЬ- префикс '*' указывает параметр как последовательность отрезков пути/ответвляться/*Тексты        BranchR    ПОЛУЧАТЬ- для упрощения грамматики составные типы должны использовать псевдоним, например. введите Тексты для '' [Текст] ''|]
  • Применение предыдущего шаблона создает следующие конструкторы маршрутов:
данные Маршрут MyApp =     HomeR                    - указывается в шаблонах как: @ {HomeR}    | BlogR                  - в шаблонах: @ {BlogR}    | СтатьяR ArticleId     - в шаблонах: @ {ArticleR myArticleId}    | BranchR Тексты          - в шаблонах: @ {BranchR myBranchSegments}
  • Для каждого поддерживаемого HTTP должна быть создана функция-обработчик, чтобы соответствовать именам отправки, сгенерированным mkYesod от parseRoutes шаблон, добавив префикс имени метода (или префикса «обработчик», если метод не указан) к ресурсу, как описано (фактические типы обработчиков версий изменились, но философия осталась):
- для "/ HomeR" - HTTP-методы не указаны ⇒ только один обработчик с префиксом '' handler ''handlerHomeR :: HasReps т  Обработчик т- для "/ blog BlogR GET POST"getBlogR :: HasReps т  Обработчик тpostBlogR :: HasReps т  Обработчик т- для "/ article / # ArticleId ArticleR GET PUT"getArticleR :: HasReps т  ArticleId  Обработчик тputArticleR :: HasReps т  ArticleId  Обработчик т

Данные запроса, параметры, файлы cookie, языки и другая информация заголовка

См. Исх.[12]

Аутентификация и авторизация

См. Исх.[14] Плагины аутентификации: OpenId, BrowserId, Электронная почта, GoogleEmail, HashDB, RpxNow.[15]

Есть важная настройка автоматического перенаправления после аутентификации.[16]

Сессии

См. Исх.[17] Серверные части сеанса: ClientSession[18] (сохраняет сеанс в файле cookie), ServerSession[19][20] (он хранит большую часть данных сеанса на сервере)

>> Чтобы избежать чрезмерных накладных расходов на полосу пропускания, производственные сайты могут обслуживать свой статический контент с отдельного доменного имени, чтобы избежать накладных расходов на передачу файла cookie сеанса для каждого запроса
Сообщения сеанса

Сообщение об успехе, неудаче или ориентировочное сообщение может быть сохранено (setMessage) в сеансе и будет показан, если он существует, default_layout рутина через default_layout.hamlet шаблон, согласованный на консультации.[21]

Подсайты

Общие подсайты с префиксом URL-адресов для рабочих процессов, обслуживания файлов или разделения сайта. См. Исх.[22][23]

Встроенные дочерние сайты: статические,[24][25] Auth[26]

Обработка форм и создание макета

См. Исх.[27]

В Форма type вот объект, который используется в контролер для анализа и обработки полей формы, введенных пользователем, и создания пары (FormResult, Widget), в которой виджет содержит макет следующей визуализации формы с сообщениями об ошибках и отметками. Его также можно использовать для создания новой формы с пробелами или значениями по умолчанию.

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

Объект формы создается из Аппликативный /Монадический состав полей для комбинированного / последовательного разбора входов полей.

Есть три типа форм:

  • Аппликативный (с табличным оформлением),
  • Монадический (со свободным стилем макета), оба в модуле Yesod.Form.Functions,
  • Ввод (только для синтаксического анализа, представление не создается) в модуле Yesod.Form.Input.

Генераторы полей, имена которых составлены из начального типа формы. (а | м | я) с последующим (req | opt) {- обязательно или необязательно -}, имеют компоненты fieldParse и fieldView.[28]

  • функция runForm {Post | Get} запускает синтаксические анализаторы полей по входам поля формы и генерирует пару (FormResult, Widget) из представлений, предлагающих новый виджет формы с полученными значениями полей формы по умолчанию. Суффикс функции - это метод http, используемый при отправке формы.
  • пока generateForm {Post | Get} игнорирует ввод от клиента и создает пустой виджет или виджет формы по умолчанию.[29]

Фактические параметры и типы функций изменились в версиях Yesod. Проверьте подписи в книге Yesod и библиотеки.

Магия в FormResult тип данных Аппликативный экземпляр, где (<*>) собирает сообщения об ошибках для случая FormFailure [textErrMsg] значения результата[30]

Монадические формы допускают произвольную компоновку и лучшую обработку hiddenField члены.[27]

Образец Аппликативный[31] форма:

- запись для наших полей формыданные Человек = Человек {personName :: Текст, человек Возраст :: Int, человек :: Может быть Текст}- тип Form имеет дополнительный параметр для встраиваемого фрагмента html, содержащий скрытое поле токена CSRF для безопасноститип Форма суб владелец Икс = HTML  MForm суб владелец (FormResult Икс, Виджет){-- для сообщений в функциях проверки:  @param master: экземпляр yesod для использования в renderMessage (возврат из getYesod обработчика)  @param languages: языки страниц для использования в renderMessage- дополнительная запись по умолчанию:  @param mbPersonDefaults: просто defaults_record или ничего для пустой формы-}personForm :: MyFoundationType  [Текст]  Может быть Человек  Форма суб владелец Человек{- '' aopt '' (необязательный компонент поля AForm) для полей "Может быть",   '' areq '' (обязательное поле AForm comp.) вставит атрибут "required"-}personForm владелец языки mbPersonDefaults = renderTable $   Человек <$> areq текстовое поле            fldSettingsName    mbNameDefault          <*> areq customPersonAgeField fldSettingsAge     mbAgeDefault          <*> aopt textareaField        fldSettingsLikings mbLikingsDefault   куда    mbNameDefault    = fmap personName    mbPersonDefaults    mbAgeDefault     = fmap человек Возраст     mbPersonDefaults    mbLikingsDefault = fmap человек mbPersonDefaults    - fieldSettingsLabel возвращает начальную запись fieldSettings     - в последнее время запись "FieldSettings" может быть определена из метки String, поскольку она реализует IsString    fldSettingsName = (fieldSettingsLabel MsgName) {fsAttrs = [("максимальная длина","20")]}    fldSettingsAge  = fieldSettingsLabel MsgAge    fldSettingsLikings = (fieldSettingsLabel MsgLikings) {fsAttrs = [("cols","40"),("строки","10")]}    customPersonAgeField = проверить validateAge intField    validateAge у        | у < 18    = Оставили $ renderMessage владелец языки MsgUnderAge        | иначе = Правильно у

Вид

Показанные типы соответствуют более старой версии, но философия остается.

Монада Handler возвращает содержимое в одном или нескольких из нескольких форматов как компоненты типов, реализующих HasReps учебный класс[32] {RepHtml, RepJson, RepXml, RepPlain, двойной RepHtmlJson, пара или список пар [(ContentType, Content)], ..}.[33][34] Примеры Json:[35][36][37]

В HasReps реализация по умолчанию selectRep выбирает представление документа, которое будет возвращено, в соответствии с предпочтительным списком типов контента клиента принимать заголовок.[32]

  • Виджеты[38] находятся HTML ДОМ код фрагменты создается с помощью определенных команд (например, setTitle) или из шаблонов структуры (html ) / поведение (JavaScript ) / стиль (css ), типы которых создают экземпляры классов ToWidget, ToWidgetHead или ToWidgetBody.

Монада виджетов,[39] на основе писателя[40] один и аргумент defaultLayout, упростите сборку виджетов.

Шаблоны на основе отступов для разметки с древовидной структурой

  • то Гамлет quasiquoter (синтаксический анализатор для времени компиляции Шаблон Haskell код)[2][41] указано в T.H. Оксфордские скобки синтаксис [qq | ... |] представляет структурированный HTML-шаблон на основе отступов. (См. Док.[42]).[43]

'$' ставит префиксы строк логических операторов.

Автоматические закрывающие теги создаются только для тега в начальной позиции строки.

  • то Whamlet quasiquoter возвращает выражение виджета. (сохраняет в виджет перед [деревня | .. |]).
toWidget [деревня |$doctype 5<html>    <!-- only the tag at the beginning of the line will be automatically closed -->    #'префиксы в тегах вводят имена классов / идентификаторов, как CSS ->    <!-- ":boolVar:" prefix in attributes makes them conditionally generated -->             синтаксис, введенный в так называемом разделе ->    <голова>        <заглавие>#{Заголовок страницы} - Мой сайт <связь rel=таблица стилей href=@{Stylesheet_route}>    <тело>        <заголовок>           ^{headerTemplate} <раздел #mySectionId>          <п><охватывать .titleClass>_{MsgArticleListTitle}</охватывать>          $если пустые статьи <п : isRed: style="красный цвет">_{MsgSorryNoArticles} $еще            <ул>                $для всех Изобразительное искусство <- статьи                    <Ли>#{номер статьи Изобразительное искусство} .- #{название статьи Изобразительное искусство} <нижний колонтитул>          ^{footerTemplate} |]
Шаблонная интерполяция - Шекспировские шаблоны

См. Исх.[42]Это шаблоны представления содержимого, которые следуют общему шаблону подстановки кодовых выражений в фигурных скобках с разными префиксами символов для ссылки

шаблонные выражения с ^{...}
относится к другим шаблонам того же типа с заданными параметрами как ^ {параметры шаблона},
выражения маршрута с @{...}
безопасные (типизированные) URL-адреса как @ {HomeR},
выражения сообщения с _{...}
i18n рендеринг сообщения как _ {MsgMessageLabel params}
другие выражения Haskell с #{...}
рендеринг выражения haskell как # {haskell_expression} какой тип должен быть конвертируемым
    • в случае Гамлет html, тип выражения должен быть экземпляром Text.Blaze.ToMarkup[44]
    • в случае css шаблоны, тип выражения должен быть экземпляром Text.Cassius.ToCss[45]
    • в случае JavaScript шаблоны, тип выражения должен быть экземпляром Text.Julius.ToJavascript [46]
    • в случае i18n определения сообщений (в "<isoLanguage>.msg) с интерполяцией параметров, тип выражения должен быть экземпляром Text.Shakespeare.I18N.ToMessage [47]
    • в случае текстовых / простых шаблонов (для использования в электронных письмах) тип выражения должен быть экземпляром Text.Shakespeare.Text.ToText [48]

Использование неанглийского текста в выражениях требует использования Unicode -сознательный тип Текст, поскольку GHC с Показать для типа Нить оказывает не-ASCII символы как экранированные числовые коды.

Шаблоны внешних файлов
  • во время компиляции: содержимое шаблона может быть загружено из внешних файлов, используя время компиляции сращивание звонит как $ (выражение).[49]
  • во время выполнения: есть режим перезагрузки для повторного анализа файлов внешних шаблонов при каждом обращении в сервис, кроме HTML Гамлет шаблоны: см. док.[50]
Другие шаблоны
для JavaScript, CoffeeScript, Рой
то Юлий quasiquoter: вводит шаблон JavaScript.[51] Варианты JavaScript CoffeeScript и Рой-язык[52] есть также конкретные квазиквотеры.[2][51]
для CSS
  • то кассий quasiquoter: представляет шаблон css со структурированием на основе отступов.[53]
  • то Люций quasiquoter: вводит шаблон css со стандартным синтаксисом плюс замены стиля шаблона Шекспира.[54]
Машинопись и JSX шаблоны
то tsc и tscJSX квазиквотеры. Только на UNIX производные (нет Windows к настоящему времени).[55]
текстовые / простые шаблоны
за электронное письмо или же текст / простой http Тип содержимого.[56]
  1. шаблоны: lt: ленивый текст, ул: строгий текст
  2. шаблоны для текста с разделителем левого поля '|': фунт (ленивый), сбт (строгий)

Локализуемые сообщения

См. Исх.[57]

Сообщения приложения Yesod можно локализовать (i18n ). Их следует проводить в Сообщения папка в файлах, названных на основе ISO, так как .msg

Записи сообщений следуют EBNF шаблон:

- EBNF: идентификатор, {'', параметр, '@', тип}, ":", текст с интерполяциямиСтатьяНе существует парам@Int64 : несуществующий статья #{парам}
  • конструкторы сообщений формируются с добавлением "Msg" к идентификатору метки сообщения.
  • тип данных сообщения формируется добавлением «Сообщение» к имени типа основания.
- в кодеmyMsg :: MyAppMessage  - тип данных, добавляющий "Сообщение" к типу основанияmyMsg = MsgArticleUnexistent myArticleId  - конструктор, добавляющий "Msg" к сообщению. метка     - в шаблонах виджетов  _{MsgArticleUnexistent myArticleId}

Действительный i18n поддержка отсутствует в куча шаблон приложения. Вы должны добавить mkMessage "MyApp" messagesFolder isoLangDefault в файл "Foundation.hs" для создания экземпляров сообщений.[58]

Навигация по хлебным крошкам

  • Навигация Панировочные сухари.[59] Вы должны предоставить экземпляр YesodBreadcrumbs для сайта, на котором работает генератор панировочные сухари должен возвращать для каждого маршрута заголовок и родительский. Затем функция запроса панировочные сухари вернет текущий заголовок маршрута и пары предков (маршрут, заголовок).

XML-карта сайта поисковой системы

  • Поисковые системы XML-файлы Sitemap,[60] куда карта сайта возвращает XML-карту сайта как http ответ, с маршрутами, которые мы хотим, чтобы поисковые системы сканировали, и атрибутами для указания сканеру из предоставленного списка SitemapUrl записи.

Просмотры веб-новостей

  • Веб-канал взгляды (RSS / Атом ).[61] У вас есть обработчики, которые возвращают содержимое RepRss, RepAtom или двойное RepAtomRss (выбирается на принимать список предпочтительных типов содержимого заголовков) из заданного Подача структура.

Модель

Использование изменяемых данных в памяти (в базовом типе данных)

Например. количество посетителей. См. Исх.[62]

Слой базы данных

  • настойчивый - это имя уровня доступа к базе данных с шаблонами для генерации типов сущностей и ключей, а также инициализации схемы.[63][64][65]

Есть первоклассная поддержка для PostgreSQL, SQLite, MongoDB, CouchDB и MySQL, с экспериментальной поддержкой Redis.[63]

Структура базы данных описана в шаблоне, в котором перечислены сущности, поля и ограничения.[66]

  • Для каждой перечисленной сущности создается целочисленный ключевой столбец «id» с атрибутами автоинкремента и первичного индекса, с псевдонимом типа, добавляющим идентификатор к имени сущности.
  • Для каждой перечисленной сущности создается тип записи, названный как сущность, если имена полей записи состоят из префикса имени сущности перед именем поля, например «personName». Тип EntityField «PersonName» также создается для ссылок на внешний ключ из других сущностей.
  • Есть автоматический миграция схемы базы данных механизм обновления схемы БД, который для успешного выполнения требует при добавлении столбцов в существующие таблицы указывать 'ограничения значения столбца по умолчанию с нотация уровня sql.[67]
  • "Не более одного" кардинальности имеет специальный механизм вокруг типа галочки.[68]
  • Слабые сущности (дочерние элементы в жизненно ограниченных отношениях владелец-потомок) не имеют специальной поддержки для каскадного удаления. триггеры, но есть функции для deleteCascade вручную в модуле Database.Persist.Class.[69]
автоматическое создание таблиц, обновление схемы и миграция таблиц
Модификации шаблона сущностей приводят к обновлению схемы с автоматическим созданием таблицы и переносом для СУБД что поддерживает "ALTER TABLE" SQL команды в migrateAll процедура, созданная из содержимого шаблона. См. «Миграции» в исх.[63] искать информацию о миграции СУБД.
Поделиться [mkPersist sqlSettings,        mkMigrate "migrateAll"   - генерирует процедуру миграции с указанным именем        ] [сопротивляться|Пользователь   - имя таблицы и тип записи сущности    - неявный автоинкремент столбца «id» в качестве первичного ключа, набранный UserId    идентификатор Текст             - относится к дб. столбец таблицы «идент»;                      - генерирует поле записи с префиксом имени таблицы как "userIdent"    пароль Текст Может быть         - Может быть указывает на поле, допускающее значение NULL    Уникальный пользователь идентификатор            - уникальное ограничение с пробелом sep. последовательность полейЭлектронное письмо  - имя таблицы и тип записи сущности    - неявный автоинкремент столбца «id» в качестве первичного ключа, набранный EmailId    электронное письмо Текст    Пользователь ID пользователя                 - внешний ключ, указав другие типы таблиц EntityField    Verkey Текст Может быть    NewAddedColumn Текст "default = 'sometext' :: изменение символа"  - Уровень sql Ограничение по умолчанию    UniqueEmail электронное письмо     -- уникальное ограничение|]
  • Esqueleto: это слой комбинаторов haskell для генерации правильных реляционных запросов к настойчивый.[70]

Пример для постоянный rawSQL и Эскелето запросы.[71]

Электронное письмо

Следующие пакеты являются частью платформа yesod:[72]

  • email-validate: проверка адреса электронной почты.[73]
  • mime-mail: напишите и отправьте MIME сообщения электронной почты.[74]

Facebook

  • Полезные функции склеивания между библиотекой fb и Yesod.[75]

Цикл разработки

Новые приложения Yesod создаются с помощью инструмента HaskellStack.[76] шаблоны, заменяющие предыдущую команду "yesod init"

Куча на основе приложения. к именам шаблонов добавляется префикс yesod как "yesod- {minimal | postgres | sqlite | mysql | mongo | ...}"

  • Поскольку HaskellStack использует штабелирование репо по умолчанию, дополнительные пакеты из взлом репо следует указывать в "stack.yaml" экстра-депс раздел.
  • Вы можете настроить пакеты в локальную подпапку. Они должны быть указаны в "stack.yaml". пакеты раздел.

Инструмент «Помощник Йесод»

  • В Yesod вспомогательный инструмент [77]
    • Yesod Devel запускается с сайта проекта, перекомпилирует и перезапускает проект при каждом изменении дерева файлов.
    • обработчик добавления yesod добавляет в проект новый обработчик и модуль, добавляя импорт предложение для обработчика в модуле «Приложение».

Развертывание с помощью Keter: монитор сервера веб-приложений и обратный прокси-сервер

См. Ссылки.[78][79][80]

Кетер - это процесс как служба, которая обрабатывает развертывание и перезапуск Yesod. веб-приложение серверов, а на веб-приложение, создание базы данных для PostgreSQL.

Консольная команда Йесод Кетер упаковывает веб-приложение. в качестве пакета кетер для загрузки в папку кетер с именем «входящие».

Кетер следит за «входящей» папкой и распаковывает приложение.к временному, затем назначает веб-приложению порт для прослушивания и запускает его.

Изначально это работало с Nginx в качестве обратный прокси (кетер версия 0.1 *), добавив виртуальный сервер записи в его настройку и внесение Nginx перезагрузите его, но теперь Кетер сам дает свой обратный прокси функциональность, удаляющая зависимость Nginx и выступающая в качестве основного веб-сервера.[81]

Старая документация (на базе Nginx).[82][83]

Интеграция с JavaScript генерируется из функциональных языков

См. Исх.[84][85][86]

Смотрите также

Рекомендации

  1. ^ "yesodweb / yesod". github.com. Получено 13 июн 2020.
  2. ^ а б c "HaskellWiki - QuasiQuotation". Haskell.org. 2012-05-26. Получено 2012-10-23.
  3. ^ «Университет Кента - Сравнение динамических и статических языковых подходов с веб-фреймворками - Yesod против Ruby on Rails» (PDF). Получено 2012-10-23.
  4. ^ "Вай пакет". Hackage.haskell.org. Получено 2012-10-23.
  5. ^ «Пакет wai-extra с обработчиком CGI WAI». Hackage.haskell.org. Получено 2012-10-23.
  6. ^ "Пакет wai-handler-fastcgi". Hackage.haskell.org. Получено 2012-10-23.
  7. ^ "Пакет wai-handler-scgi". Hackage.haskell.org. Получено 2012-10-23.
  8. ^ "Деформационный пакет". Hackage.haskell.org. Получено 2012-10-23.
  9. ^ "Пакет вай-хендлер-запуск". Hackage.haskell.org. Получено 2012-10-23.
  10. ^ а б "книга - Основы". Yesodweb.com. Получено 2012-10-23.
  11. ^ В mkYesod код
  12. ^ а б "книга - Маршрутизация и обработчики". Yesodweb.com. Получено 2012-10-23.
  13. ^ «Игра с маршрутами и ссылками». FPComplete.com. 2012-10-17. Получено 2012-10-28.
  14. ^ «книга - Аутентификация и авторизация». Yesodweb.com. Получено 2012-10-23.
  15. ^ "Пакет yesod-auth". Hackage.haskell.org. Получено 2012-10-26.
  16. ^ "книга - Сеансы - См. раздел" Конечная цель"". Yesodweb.com. Получено 2012-11-17.
  17. ^ "Сеансы". Yesodweb.com. Получено 2012-10-23.
  18. ^ "Web.ClientSession". Hackage.haskell.org. Получено 2012-10-25.
  19. ^ «ServerSession: безопасные модульные сеансы на стороне сервера». Hackage.haskell.org. Получено 2018-10-29.
  20. ^ "Web.ServerSession.Frontend.Yesod". Hackage.haskell.org. Получено 2018-10-29.
  21. ^ «Сессионные сообщения». Yesodweb.com. Получено 2018-10-23.
  22. ^ «Создание дочернего сайта». Yesodweb.com. Получено 2012-10-25.
  23. ^ «Йесод и подсайты: легкая задача». Monoid.se. 2012-08-22. Получено 2012-10-28.[]
  24. ^ «Магия Йесод, часть 2 - См. Раздел« Статический подсайт »"". Yesodweb.com. 2010-12-25. Получено 2012-10-25.
  25. ^ «Пакет yesod-static - Статический субсайт». Hackage.haskell.org. Получено 2012-10-25.
  26. ^ "Пакет yesod-auth - Auth Subsite". Hackage.haskell.org. Получено 2012-10-25.
  27. ^ а б "книга - Формы". Yesodweb.com. Получено 2012-10-23.
  28. ^ "Йесод.Форма.Поля". Hackage.haskell.org. Получено 2012-10-23.
  29. ^ "Yesod.Form.Functions runFormPost". Hackage.haskell.org. Получено 2012-10-25.
  30. ^ "Yesod.Form.Types". Hackage.haskell.org. Получено 2012-10-23.
  31. ^ "HaskellWiki - аппликативный функтор". haskell.org. Получено 2012-10-24.
  32. ^ а б «Класс HasReps». Hackage.haskell.org. Получено 2012-10-23.
  33. ^ "RESTful Content". Yesodweb.com. Получено 2012-10-23.
  34. ^ «Класс ToContent». Hackage.haskell.org. Получено 2012-10-23.
  35. ^ «Еще на стороне клиента Yesod: пример задачи». Yesodweb.com. 2012-04-23. Получено 2012-10-23.
  36. ^ «Веб-служба JSON». Yesodweb.com. Получено 2012-10-23.
  37. ^ "Пакет yesod-json". Hackage.haskell.org. Получено 2012-10-23.
  38. ^ "книга - Виджеты". Yesodweb.com. Получено 2012-10-23.
  39. ^ "Монада виджетов". Hackage.haskell.org. Получено 2012-10-23.
  40. ^ "Монада писателя". Haskell.org. Получено 2012-10-23.
  41. ^ "Квази-цитата шаблона Haskell". Haskell.org. Получено 2012-11-02.
  42. ^ а б «книга - шекспировские шаблоны». Yesodweb.com. Получено 2012-10-23.
  43. ^ «Шаблонный модуль деревушки». Hackage.haskell.org. Получено 2012-10-23.
  44. ^ «Класс Text.Blaze.ToMarkup». Hackage.haskell.org. Получено 2012-10-23.
  45. ^ "Класс Text.Cassius.ToCss". Hackage.haskell.org. Получено 2012-10-23.
  46. ^ "Класс Text.Julius.ToJavascript". Hackage.haskell.org. Получено 2012-10-23.
  47. ^ "Класс Text.Shakespeare.I18N.ToMessage". Hackage.haskell.org. Получено 2012-10-24.
  48. ^ "Класс Text.Shakespeare.Text.ToText". Hackage.haskell.org. Получено 2012-10-24.
  49. ^ «Шаблон Haskell». haskell.org. Получено 2012-11-03.
  50. ^ "книга - Шекспировские шаблоны # Вызов Шекспира". Yesodweb.com. Получено 2012-10-23.
  51. ^ а б "Модуль шаблонов Julius". Hackage.haskell.org. Получено 2012-10-23.
  52. ^ "Рой язык". Roy.brianmckenna.org. Получено 2012-10-23.
  53. ^ "Модуль шаблона Cassius". Hackage.haskell.org. Получено 2012-10-23.
  54. ^ "Модуль шаблона Lucius". Hackage.haskell.org. Получено 2012-10-23.
  55. ^ "Модуль шаблона машинописного текста". Hackage.haskell.org. Получено 2018-10-10.
  56. ^ "Модуль шаблонов обычного текста Шекспира". Hackage.haskell.org. Получено 2012-10-24.
  57. ^ "книга - Интернационализация". Yesodweb.com. Получено 2012-10-23.
  58. ^ mkMessage
  59. ^ "Класс YesodBreadcrumbs". Hackage.haskell.org. Получено 2012-11-05.
  60. ^ "Пакет yesod-sitemap". Hackage.haskell.org. Получено 2012-10-26.
  61. ^ "Пакет yesod-newsfeed для просмотров RSS / Atom". Hackage.haskell.org. Получено 2012-10-26.
  62. ^ «Книга - Инициализация данных в базовом типе данных». Yesodweb.com. Получено 2014-05-26.
  63. ^ а б c "книга - стойкая". Yesodweb.com. Получено 2012-10-23.
  64. ^ «Постоянный пакет Yesod». Hackage.haskell.org. Получено 2012-10-23.
  65. ^ "Постоянные документы Yesod". github.com. Получено 2018-10-16.
  66. ^ "Синтаксис постоянных сущностей Yesod". github.com. Получено 2018-10-16.
  67. ^ «Избыточные миграции для значений полей по умолчанию». GitHub.com. Получено 2012-12-04.
  68. ^ ""Максимальное количество элементов в настойчивый с типом галочки ". Hackage.haskell.org. Получено 2018-10-16.
  69. ^ «Как я могу создать ограничение внешнего ключа с помощью Yesod / Persistent?». stackoverflow.com. Получено 2018-10-16.
  70. ^ "пакет esqueleto". Hackage.haskell.org. Получено 2012-10-23.
  71. ^ "Пример запроса в". Stackoverflow.com. 2012-09-19. Получено 2012-10-23.
  72. ^ "Пакет йесод". Hackage.haskell.org. Получено 2019-06-26.
  73. ^ "Пакет проверки электронной почты". Hackage.haskell.org. Получено 2012-10-26.
  74. ^ "Пакет mime-mail". Hackage.haskell.org. Получено 2012-10-26.
  75. ^ "Пакет yesod-fb". Hackage.haskell.org. Получено 2012-10-26.
  76. ^ Haskell Stack - Как установить
  77. ^ Пакет yesod-bin с вспомогательным инструментом (с инструкциями по использованию с куча инструмент)
  78. ^ "книга - Развертывание вашего веб-приложения". Yesodweb.com. Получено 2012-10-23.
  79. ^ Readme.Md. «Йесод кетер ридми». GitHub. Получено 2012-10-23.
  80. ^ «Пакет кетер». Hackage.haskell.org. Получено 2012-10-23.
  81. ^ «Кетер обновления». Yesodweb.com. 2012-10-25. Получено 2012-10-25.
  82. ^ «Кетер: развертывание веб-приложений». Yesodweb.com. 2012-05-11. Получено 2012-10-23.
  83. ^ «Кетер: это живо!». Yesodweb.com. 2012-05-17. Получено 2012-10-23.
  84. ^ «Параметры Javascript». github.com. Получено 2014-03-12.
  85. ^ «Йесод, AngularJS и Фэй». yesodweb.com. 2012-10-30. Получено 2014-03-12.
  86. ^ «HaskellWiki - проблема JavaScript». haskell.org. Получено 2014-04-12.

внешняя ссылка

Блог учебники

Сравнения

Другие языки

В дистрибутивах GNU / Linux