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

Йесод
Оригинальный автор(ы)Майкл Снойман
Разработчик(и)Майкл Снойман и др.
Первоначальный выпуск2010 ; 14 лет назад (2010)
Стабильный релиз
1.6.24.5 [1]  / 14 сентября 2023 г. ; 13 месяцев назад (14 September 2023)
Репозиторий
  • github.com/yesodweb/yesod
Написано вХаскелл
Операционная системаКроссплатформенный
Доступно вАнглийский
ТипВеб-фреймворк
ЛицензияМассачусетский технологический институт
Веб-сайтwww.yesodweb.com

Yesod ( IPA: [je'sod] ; иврит : יְסוֺד , «Основание») — это веб-фреймворк на основе языка программирования Haskell для продуктивной разработки типобезопасных, основанных на модели передачи репрезентативного состояния ( REST ) ​​(где унифицированные указатели ресурсов ( URL ) идентифицируют ресурсы, а методы протокола передачи гипертекста (HTTP) идентифицируют переходы), высокопроизводительных веб-приложений, разработанный Майклом Снойманом и др. Это бесплатное программное обеспечение с открытым исходным кодом, выпущенное по лицензии MIT .

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

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

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

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

Yesod использует шаблон проектирования программного обеспечения «модель-представление-контроллер» (MVC) для своих пользовательских интерфейсов .

Контроллер

Интерфейс сервера

Yesod использует интерфейс веб-приложений (WAI), [4] тип интерфейса прикладного программирования ( API ), для изоляции сервлетов , также известных как веб-приложения, от серверов, с обработчиками для серверных протоколов Common Gateway Interface (CGI), [5] FastCGI , [6] Simple Common Gateway Interface (SCGI), [7] Warp, [8] Launch (открывается как локальный URL-адрес в браузере по умолчанию, закрывая сервер при закрытии окна), [9]

Theфундаменттип

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

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

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

Вставка вызова mkYesod приведет к вызову примитивов Template Haskell для генерации кода [11], соответствующего членам типа маршрута, и экземпляров классов диспетчерского контроллера для отправки вызовов GET для маршрутизации HomeR в процедуру, названную «getHomeR», ожидая существующий обработчик, соответствующий имени.

Привет, мир

Пример программы «Hello, World!» на основе интерфейса сервера Common Gateway Interface (CGI) (типы обработчиков изменились, но философия осталась):

{- файл wai-cgi-hello.hs -} {-# ЯЗЫК PackageImports, TypeFamilies, QuasiQuotes, MultiParamTypeClasses,  TemplateHaskell, OverloadedStrings #-} import "wai" Network.Wai import "wai-extra" Network.Wai.Handler.CGI ( run ) -- взаимозаменяемый обработчик WAI      импорт "yesod" Yesod импорт "yesod-core" Yesod.Handler ( getRequest ) импорт "text" Data.Text ( Текст ) импорт "shakespeare" Text.Cassius ( Цвет ( .. ), colorBlack )            -- данные типа Foundation MyApp = MyApp   -- шаблон карты сайта, путь к списку, имя ресурса и методы приняты -- `mkYesod` принимает имя типа основы в качестве параметра для составления имени функций диспетчеризации mkYesod "MyApp" [ parseRoutes | / HomeR GET | ]    экземпляр Yesod MyApp  -- структурированный шаблон CSS с отступами myStyle :: [ Текст ] CssUrl url myStyle paramStyle = [ cassius | . box border : 1 px solid # { boxColor } | ] где boxColor = case paramStyle of [ "high-contrast" ] colorBlack _ Color 0 0 255                           -- структурированный HTML-шаблон с отступами myHtml :: [( Текст , Текст )] HtmlUrl url myHtml параметры = [ hamlet |         
<!-- отступ или его отсутствие под начальными тегами или командами (префикс ' $ ')  описывает содержимое или структуру дерева последовательности --> <!-- префиксы '.' или ' # ' в тегах вводят значения атрибутов "class" или "id" в стиле css --> <!-- интерполяция выражений haskell следует синтаксису "шаблонов шекспира" #{ expr } -->< p > Привет, мир! Есть < span  . box > #{ length params} параметры </ span > : $ if null params < p > Ничего не перечислить $ else  < ul >  $ forall param < -  params  < li > #{ fst param}: #{ snd param}|]
getHomeR :: Handler RepHtml getHomeR = do req <- getRequest let params = reqGetParams req paramStyle <- lookupGetParams "style" defaultLayout $ do -- добавление виджетов в монаду Widget (монаду ''Writer'') setTitle "Yesod example" toWidgetHead $ myStyle paramStyle toWidgetBody $ myHtml params                                -- существуют варианты функции ''run'' для разных обработчиков WAImain = toWaiApp MyApp >>= запустить     
# cgi test export REMOTE_ADDR = 127 .0.0.1 export REQUEST_METHOD = GET export PATH_INFO = / export QUERY_STRING = 'p1=abc;p2=def;style=high-contrast'    ./wai-cgi-привет

[10]

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

См. ссылку [12] [13] Yesod следует репрезентативной модели передачи состояния доступа к веб-документам, идентифицируя документы и каталоги как ресурсы с помощью конструктора Route, именованного с заглавным суффиксом R (например, HomeR).

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

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

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

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

См. ссылку [12]

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

См. ссылку [14] Плагины аутентификации: OpenID , BrowserID , Email, 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] Авторизация [26]

Обработка форм, генерация макета

См. ссылку [27]

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

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

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

Существует три типа форм:

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

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

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

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

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

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

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

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

Вид

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

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

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

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

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

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

  • hamlet quadracyquoter (анализатор кода Template Haskell во время компиляции ) [2] [41], указанный в синтаксисе скобок TH Oxford, представляет структурированный шаблон HTML на основе отступов. (См. документ [ 42] ). [43][qq| ... |]

«$» предваряет строки логических утверждений.

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

  • квазицитатник whamlet возвращает выражение Widget. (сохраняет в Widget перед [hamlet|..|]).
toWidget [hamlet| $ doctype 5 < html >  <!-- автоматически закрывается только тег в начале строки -->  <!-- префиксы '.' или ' # ' в тегах вводят имена классов/идентификаторов в стиле CSS -->  <!-- префикс ":boolVar:" в атрибутах делает их условно сгенерированными -->  <!-- интерполяция выражений Haskell следует синтаксису "шекспировских шаблонов",  введенному в одноименном разделе --> <head> <title> #{ pageTitle } - Мой сайт < link rel = stylesheet href = @ { Stylesheet_route } > <body> <header> ^ {  headerTemplate } < section #mySectionId > <p> < span.titleClass > _ { MsgArticleListTitle } </span> $ if null articles < p : isRed : style = " color : red " > _ { MsgSorryNoArticles } $ else <ul> $ forall art < - articles <li> # { articleNumber art } .- # { articleTitle art } <footer> ^ { footerTemplate }             |]
Интерполяция шаблона -Шекспировские шаблоны

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

шаблонные выражения с^{...}
относится к другим шаблонам того же типа с заданными параметрами, такими как ^{template params},
выражения маршрута с@{...}
безопасные (типизированные) URL-адреса как @{HomeR},
выражения сообщений с_{...}
i18n сообщение отображается как_{MsgMessageLabel params}
другие выражения Haskell с#{...}
рендеринг выражения haskell, #{haskell_expression}тип которого должен быть конвертируемым
    • в случае HTML-шаблонов Hamlet тип выражения должен быть экземпляром 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]

Использование неанглийского текста в выражениях требует использования типа Text, поддерживающего Unicode , поскольку компилятор Glasgow Haskell (GHC) для типа String отображает не- ASCII- символы как экранированные числовые коды.

Шаблоны внешних файлов
  • во время компиляции: содержимое шаблона может быть загружено из внешних файлов с использованием вызовов сращивания во время компиляции как $(expr) . [49]
  • во время выполнения: существует режим перезагрузки для повторного анализа внешних файлов шаблонов при каждом вызове службы, за исключением шаблонов HTML Hamlet : см. документ [50]
Другие шаблоны
для JavaScript, CoffeeScript, Рой
квазицитатор julius : представляет шаблон JavaScript. [51] Варианты JavaScript CoffeeScript и Roy-language [52] также имеют определенные квазицитаторы . [2] [51]
для CSS-стиля
  • cassius quadraquoter: представляет шаблон css со структурированием на основе отступов. [ 53]
  • lucius quadraquoter: представляет шаблон css со стандартным синтаксисом, а также замены в стиле shakespeare-template. [ 54]
Шаблоны TypeScript и JSX
квазицитаты tsc и tscJSX . Только на производных UNIX ( Windows пока нет). [55]
текстовые/простые шаблоны
для электронной почты или типа содержимого text/plain http . [56]
  1. шаблоны: lt : ленивый текст, st : строгий текст
  2. шаблоны для текста с разделителем левого поля '|': lbt (ленивый), sbt (строгий)

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

См. ссылку [57]

Сообщения приложения Yesod локализуются ( i18n ). Они должны храниться в папке сообщений , в файлах, названных на основе ISO , как <iso-language>.msg

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

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

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

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

Поисковая система XML Sitemap

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

Просмотры веб-каналов

  • Просмотры веб-каналов ( RDF Site Summary (RSS) – Atom ). [61] Обработчики возвращают контент RepRss, RepAtom или двойной контент RepAtomRss (который должен быть выбран в списке предпочтительных типов контента заголовков приема ) из заданной структуры канала .

Модель

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

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

Уровень базы данных

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

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

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

  • Для каждой перечисленной сущности генерируется целочисленный ключевой столбец «id» с атрибутами автоинкремента и первичного индекса, с псевдонимом типа, добавляющим Id к имени сущности.
  • Для каждой перечисленной сущности генерируется тип записи, названный как сущность, где имена полей записи составляются с префиксом имени сущности к имени поля, например, "personName". Тип EntityField "PersonName" также генерируется для ссылок на внешние ключи из других сущностей.
  • Существует автоматический механизм миграции схемы базы данных для обновлений схемы базы данных, который для успешного выполнения требует при добавлении столбцов в существующие таблицы указывать «ограничения значений столбцов по умолчанию с нотацией уровня SQL» . [67]
  • У мощности «не более одного» есть специальный механизм вокруг типа Checkmark. [68]
  • Слабые сущности (потомки в ограниченных жизненными связями владелец-потомок) не имеют специальной поддержки для каскадных триггеров удаления , но есть функции для ручного удаления Cascade в модуле Database.Persist.Class. [69]
автоматическое создание таблиц, обновление схемы и миграция таблиц
Изменения шаблона сущностей приводят к обновлению схемы с автоматическим созданием таблиц и миграции для СУБД , которые поддерживают команды SQL "ALTER TABLE" в процедуре migrateAll , сгенерированной из содержимого шаблона. См. "Миграции" в ссылке [63], чтобы найти СУБД , поддерживающие миграцию .
share [ mkPersist sqlSettings , mkMigrate "migrateAll" -- генерирует процедуру миграции с указанным именем ] [ persist |       Пользователь -- имя таблицы и тип записи сущности -- неявный автоинкрементный столбец "id" в качестве первичного ключа, типизированный UserId ident Text -- ссылается на столбец таблицы БД "ident"; -- генерирует поле записи, добавляя к имени таблицы префикс "userIdent" password Text Maybe -- Maybe указывает на поле, допускающее значение NULL UniqueUser ident -- уникальное ограничение с разделителем-пробелом. последовательность полей             Email -- имя таблицы и тип записи сущности -- неявный автоинкрементный столбец "id" в качестве первичного ключа, типизированный EmailId email Text user UserId -- внешний ключ путем указания других таблиц EntityField types verkey Text Maybe           newlyAddedColumn Текст "default='sometext'::character variationing" -- ограничение по умолчанию на уровне SQL    UniqueEmail адрес электронной почты – уникальное ограничение | ]  
  • Esqueleto: представляет собой слой комбинаторов Haskell для генерации корректных реляционных запросов к постоянным . [70]

Пример для постоянных запросов rawSQL и Esqueleto . [71]

Электронная почта

Следующие пакеты являются частью yesod-platform : [72]

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

Фейсбук

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

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

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

Имена шаблонов приложений на основе стека начинаются с префикса yesod, например «yesod-{minimal | postgres | sqlite | mysql | mongo | ...}»

  • Поскольку HaskellStack по умолчанию использует репозиторий stackage , дополнительные пакеты из репозитория hackage следует указывать в разделе extra-deps "stack.yaml" .
  • Пакеты могут быть настроены в локальной подпапке. Они должны быть указаны в разделе пакетов "stack.yaml" .

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

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

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

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

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

Консольная команда yesod keterупаковывает веб-приложение в пакет keter для загрузки в папку keter с именем «incoming».

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

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

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

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

См. ссылку [84] [85] [86]

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

Ссылки

  1. ^ "yesodweb/yesod".
  2. ^ abc "HaskellWiki - QuasiQuotation". Haskell.org. 2012-05-26 . Получено 2012-10-23 .
  3. ^ "Университет Кента - Сравнение динамических и статических языковых подходов к веб-фреймворкам - Yesod против Ruby on Rails" (PDF) . Получено 23.10.2012 .
  4. ^ "Пакет wai". 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. ^ "Пакет warp". Hackage.haskell.org . Получено 2012-10-23 .
  9. ^ "Пакет wai-handler-launch". Hackage.haskell.org . Получено 2012-10-23 .
  10. ^ ab "книга - Основы". Yesodweb.com . Получено 2012-10-23 .
  11. ^ Код mkYesod
  12. ^ ab "книга - Маршрутизация и обработчики". 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 . Получено 29.10.2018 .
  20. ^ "Web.ServerSession.Frontend.Yesod". Hackage.haskell.org . Получено 29.10.2018 .
  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. ^ ab "book - Forms". Yesodweb.com . Получено 2012-10-23 .
  28. ^ "Yesod.Form.Fields". 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. ^ ab "Класс 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: пример todo". Yesodweb.com. 2012-04-23 . Получено 2012-10-23 .
  36. ^ "JSON Web Service". 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. ^ "The Writer monad". Haskell.org . Получено 2012-10-23 .
  41. ^ "Шаблон квазицитаты Haskell". Haskell.org . Получено 2012-11-02 .
  42. ^ ab "книга - шекспировские шаблоны". Yesodweb.com . Получено 2012-10-23 .
  43. ^ "Модуль шаблона hamlet". 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. ^ ab "Модуль шаблона 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. ^ "Модуль шаблона Typescript". Hackage.haskell.org . Получено 2018-10-10 .
  56. ^ "Модуль шаблонов простого текста Шекспира". Hackage.haskell.org . Получено 2012-10-24 .
  57. ^ "книга - Интернационализация". Yesodweb.com . Получено 2012-10-23 .
  58. ^ mkСообщение
  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. ^ abc "book - Persistent". Yesodweb.com . Получено 2012-10-23 .
  64. ^ "Yesod-persistent package". Hackage.haskell.org . Получено 2012-10-23 .
  65. ^ "Yesod-persistent docs". github.com . Получено 2018-10-16 .
  66. ^ "Синтаксис сущностей Yesod-persistent". github.com . Получено 2018-10-16 .
  67. ^ "Избыточные миграции для значений полей по умолчанию". GitHub.com . Получено 2012-12-04 .
  68. ^ "Принудительное применение мощности "At most one" в постоянных с типом Checkmark". Hackage.haskell.org . Получено 2018-10-16 .
  69. ^ «Как создать ограничение внешнего ключа с помощью Yesod/Persistent?». stackoverflow.com . Получено 16.10.2018 .
  70. ^ "esqueleto package". Hackage.haskell.org . Получено 2012-10-23 .
  71. ^ "Пример запроса на". Stackoverflow.com. 2012-09-19 . Получено 2012-10-23 .
  72. ^ "Пакет yesod". 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. "Yesod keter readme". GitHub . Получено 2012-10-23 .
  80. ^ "Пакет keter". Hackage.haskell.org . Получено 2012-10-23 .
  81. ^ "Обновления Кетер". Yesodweb.com. 2012-10-25 . Получено 2012-10-25 .
  82. ^ "Keter: Web App Deployment". 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. ^ "Yesod, AngularJS и Fay". yesodweb.com. 2012-10-30 . Получено 2014-03-12 .
  86. ^ "HaskellWiki - Проблема JavaScript". haskell.org . Получено 2014-04-12 .
  • Официальный сайт
  • Презентации: InfoQ, Haskell eXchange 2012
  • Слайды: ACM в Университете Джонса Хопкинса — веб-сайты ReST-ful с Yesod
  • ScreenCast: Йесод 1.0 на Vimeo
  • Электронная книга O'Reilly - Разработка веб-приложений с использованием Haskell и Yesod - Безопасная веб-разработка
  • Вопросы и ответы: StackOverflow.com - Yesod с тегом Вопросы и ответы

Блог-руководства

  • FPComplete.com — мой первый веб-сайт, играемся с маршрутами и ссылками
  • Йесод для новичков
  • hamberg.no - handlerToIO: использование forkIO в обработчиках Yesod

Сравнения

  • HaskellWiki - веб-фреймворки Haskell
  • Надеюсь, справедливое и полезное сравнение веб-фреймворков Haskell
  • Университет Кента - Сравнение динамических и статических языковых подходов к веб-фреймворкам - Yesod против Ruby on Rails

Другие языки

  • Haskell Biblio. - Йесод (на испанском языке) Университет Кадиса

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

  • Yesod в Debian
  • Yesod в Ubuntu
Retrieved from "https://en.wikipedia.org/w/index.php?title=Yesod_(web_framework)&oldid=1256332278"