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

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

Yesod (IPA: ; Иврит : יְסוֺד, «Фонд») - это бесплатный веб-фреймворк с открытым исходным кодом на основе Haskell для продуктивной разработки шрифтов. -safe, REST на основе модели (где URL идентифицируют ресурсы, а методы HTTP идентифицируют переходы), высокопроизводительные веб-приложения, разработанные et al.

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

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

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

Содержание
  • 1 Архитектура MVC
    • 1.1 Контроллер
      • 1.1.1 Интерфейс сервера
      • 1.1.2 Тип основания
      • 1.1.3 Hello World
      • 1.1.4 Ресурсы, маршруты и Обработчики методов HTTP
      • 1.1.5 Данные запроса, параметры, файлы cookie, языки и другая информация заголовка
      • 1.1.6 Аутентификация и авторизация
      • 1.1.7 Сеансы
        • 1.1.7.1 Сессионные сообщения
      • 1.1. 8 Подсайты
      • 1.1.9 Обработка форм и создание макета
    • 1.2 Вид
      • 1.2.1 Шаблоны на основе отступов для древовидной разметки
        • 1.2.1.1 Интерполяция шаблонов - Шекспировские шаблоны
        • 1.2.1.2 Другие шаблоны
      • 1.2.2 Локализуемые сообщения
      • 1.2.3 Навигационные крошки
      • 1.2.4 XML-карта сайта поисковой системы
      • 1.2.5 Представления веб-новостей
    • 1.3 Модель
      • 1.3.1 Использование in-memory изменяемые данные (в базовом типе данных)
      • 1.3.2 Уровень базы данных
    • 1.4 Электронная почта
    • 1.5 Facebook
  • 2 Цикл разработки
    • 2.1 Инструмент «Помощник Yesod»
    • 2.2 Развертывание с Keter: монитор сервера веб-приложений и обратный прокси-сервер
  • 3 Интеграция с JavaScript, созданным на основе функциональных языков
  • 4 См. Также
  • 5 Ссылки
  • 6 Внешние ссылки
    • 6.1 Руководства по блогам
    • 6.2 Сравнения
    • 6.3 Другие языки
    • 6.4 В дистрибутивах GNU / Linux
Архитектура MVC

Контроллер

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

Yesod использует интерфейс веб-приложения API, сокращенно WAI, для изоляции сервлетов, или веб-приложения., С серверов, с обработчиками для серверных протоколов CGI, FastCGI, SCGI, Warp, Launch (открыть как локальный URL-адрес в браузере по умолчанию, закрыть сервер при закрытии окна),

Тип основания

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

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

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

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

Hello World

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

{- file wai-cgi-hello.hs -} {- # LANGUAGE PackageImports, TypeFamilies, QuasiQuotes, MultiParamTypeClasses, TemplateHaskell, OverloadedStrings # -} import "wai" Network.Wai import "wai-extra" Network.Wai.Handler.CGI (запустить) - взаимозаменяемый обработчик WAI import "yesod" Yesod import "yesod-core" Yesod.Handler (getRequest) import "text" Data.Text (Text) import "shakespeare" Text.Cassius (Color (..), colorBlack) - - данные типа Foundation MyApp = MyApp - шаблон карты сайта, путь к списку, имя ресурса и принятые методы - mkYesod принимает имя типа основания в качестве параметра. для составления имен диспетчерских функций mkYesod "MyApp" [parseRoutes | / HomeR GET |] экземпляр Yesod MyApp - шаблон CSS со структурой отступов myStyle :: [Text] → CssUrl url myStyle paramStyle = [cassius |.box border: 1px solid # {boxColor} |], где boxColor = case paramStyle of ["высококонтрастный"] → colorBlack _ → Color 0 0 255 - HTML-шаблон со структурированным отступом myHtml :: [(Text, Text)] → URL-адрес HtmlUrl myHtml params = [деревня |

Привет, мир! Есть # {параметры длины} параметры : $ if null params

Ничего не перечислить $ else

    $ forall param <- params
  • # {fst param}: # {snd param} |]
getHomeR :: Handler RepHtml getHomeR = do req <- getRequest let params = reqGetParams req paramStyle <- lookupGetParams "style" defaultLayout $ do -- adding widgets to the Widget monad (a ''Writer'' monad) setTitle "Yesod example" toWidgetHead $ myStyle paramStyle toWidgetBody $ myHtml params -- there are ''run'' function variants for different WAI handlers main = toWaiApp MyApp>>= run
# 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-hello

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

См. исх. Yesod следует модели REpresentational State Transfer доступа к веб-документам, идентифицируя документы. и каталоги как ресурсы с конструктором маршрута, названным с суффиксом R в верхнем регистре (например, HomeR).

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

Захват сегмента URL-адреса в качестве параметра возможен с указанием префикса '#' для одиночного сегментный захват или "*" для многосегментного захвата, за которым следует тип параметра.

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

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

См. Исх.

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

См. Исх. Плагины аутентификации: OpenId, BrowserId, Email, GoogleEmail, HashDB, RpxNow.

Существует важный параметр для автоматического перенаправления после аутентификации.

Сеансы

См. Исх. Бэкэнды сеанса: ClientSession (он сохраняет сеанс в файле cookie), ServerSession (он хранит большую часть данных сеанса на сервере)

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

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

Подсайты

Подсайты с общим префиксом URL для рабочих процессов, обслуживания файлов или разделения сайта. См. Ссылку

Встроенные дочерние сайты: Static, Auth

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

См. Ссылку

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

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

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

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

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

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

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

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

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

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

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

- запись для данных полей нашей формы Person = Person {personName :: Text, personAge :: Int, personLikings :: Maybe Text} - тип Form имеет дополнительный параметр для встраиваемого фрагмента html, содержащий скрытое поле токена CSRF для типа безопасности Sub master x = Html → MForm sub master (FormResult x, Widget) { - - для сообщений в функциях проверки: @param master: экземпляр yesod для использования в renderMessage (возврат из getYesod обработчика) @param languages: языки страниц для использования в renderMessage - необязательная запись по умолчанию: @param mbPersonDefaults: Just defaults_record, или ничего для пустой формы -} personForm :: MyFoundationType → [Text] → Maybe Person → Sub master P erson {- '' aopt '' (необязательный компонент поля AForm) для полей "Может быть", '' areq '' (обязательный fld AForm comp.) вставит атрибут "required" -} Основные языки personForm mbPersonDefaults = renderTable $ Person <$>areq TextField fldSettingsName mbNameDefault <*>areq customPersonAgeField fldSettingsAge mbAgeDefault <*>Aopt textareaField fldSettingsLikings mbLikingsDefault где mbNameDefault = БПМЖ PERSONNAME mbPersonDefaults mbAgeDefault = БПМЖ персонажа mbPersonDefaults mbLikingsDefault = БПМЖ personLikings mbPersonDefaults - "fieldSettingsLabel" возвращает первоначальную fieldSettings запись - недавно Запись «FieldSettings» может быть определена из метки String, поскольку она реализует IsString fldSettingsName = (fieldSettingsLabel MsgName) {fsAttrs = [(«maxlength», «20»)]} fldSettingsAge = fieldSettingsLabel MsgAge fldSettingsLikings = (fieldSettingsLikings) ("столбцы", "40"), ("строки", "10")]} customPersonAgeField = проверить validateAge intField validateAge y | y < 18 = Left $ renderMessage master languages MsgUnderAge | otherwise = Right y

View

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

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

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

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

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

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

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

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

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

  • квазиквотер whamlet возвращает выражение Widget. (сохраняет toWidget перед [деревня |.. |]).
toWidget [деревня | $ doctype 5 # {pageTitle} - Мой сайт <body><header>^ {headerTemplate} <section #mySectionId><p>_ {MsgArticleListTitle} $ if null article <p :isRed:>_ {MsgSorryNoArticles} $ else <ul class="ul_main">$ forall art <- articles <li># {articleNumber art}.- # {articleTitle art} <footer>^ {footerTemplate} |]</pre><h5>Интерполяция шаблонов - шекспировские шаблоны</h5><p>См. Исх. Это шаблоны представления содержимого, которые следуют общему шаблону подстановки кодовых выражений в фигурных скобках с разными префиксом символов для ссылки на</p><dl><dt>выражения шаблона с <code>^ {...}</code></dt><dd>относится к другим шаблонам того же типа., с заданными параметрами как <code>^ {template params}</code>,</dd><dt>выражения маршрута с <code>@ {...}</code></dt><dd>безопасными (типизированными) URL-адресами как <code>@ {HomeR}</code>,</dd><dt>выражения сообщений с <code>_ {...}</code></dt><dd><a href="/w/I18n">i18n</a> рендеринг сообщения как <code>_ {MsgMessageLabel params}</code></dd><dt>другие выражения Haskell с <code># {...}</code></dt><dd>рендерингом выражения haskell как <code># {haskell_expression}</code>какой тип должен быть конвертируемым</dd></dl><ul class="ul_main"><li><ul class="ul_main"><li>в случае hamlet html-шаблонов, тип выражения должен быть экземпляром Text.Blaze.ToMarkup</li><li>в случае шаблонов <a href="/w/Css">css</a> тип выражения должен быть экземпляром Text.Cassius.ToCss</li><li>в случае шаблонов <a href="/w/JavaScript">JavaScript</a> тип выражения должен быть экземпляром of Text.Julius.ToJavascript</li><li>в случае <a href="/w/I18n">i18n</a> mes определения sage (в файлах "<code><isoLanguage></code>.msg") с интерполяцией параметров, тип выражения должен быть экземпляром Text.Shakespeare.I18N.ToMessage</li><li>в случае текстовых / простых шаблонов (для использования в электронных письмах), тип выражения должен быть экземпляром Text.Shakespeare.Text.ToText</li></ul></li></ul><p>. Использование неанглийского текста в выражениях требует использования <a href="/w/Unicode">Unicode</a> типа Text, поскольку <a href="/w/Glasgow_Haskell_Compiler">GHC</a> для типа String отображает символы, отличные от <a href="/w/ASCII">ASCII</a>, как экранированные числовые коды.</p><dl><dt>Шаблоны внешних файлов</dt><dd></dd></dl><ul class="ul_main"><li>во время компиляции: содержимое шаблона может быть загружено из внешних файлов с помощью вызовов splice во время компиляции как $ (expr).</li><li>во время выполнения: есть режим перезагрузки для повторного анализа внешних файлов. файлы шаблонов при каждом обращении к сервису, за исключением HTML-шаблонов деревушек: см. документ</li></ul><h5>Другие шаблоны</h5><dl><dt>для JavaScript, CoffeeScript, Рой</dt><dd>квазиквотер julius: представляет шаблон JavaScript. Варианты JavaScript <a href="/w/CoffeeScript">CoffeeScript</a> и язык Roy также имеют особые квазиквотеры.</dd></dl><dl><dt>для CSS</dt><dd></dd></dl><ul class="ul_main"><li>квазиквотер cassius: вводит шаблон css со структурированием на основе отступов.</li><li>квазиквотер lucius: вводит шаблон css со стандартным синтаксисом плюс подстановки в стиле шаблона Шекспира.</li></ul><dl><dt><a href="/w/TypeScript">TypeScript</a> и <a href="/w/React_(JavaScript_library)#JSX">JSX</a> templates</dt><dd>квазиквотеры tsc и tscJSX. Только в <a href="/w/UNIX">UNIX</a> производных (сейчас нет <a href="/w/Windows">Windows</a> ).</dd></dl><dl><dt>текстовые / простые шаблоны</dt><dd>для <a href="/w/E-mail">электронной почты</a> или текст / простые <a href="/w/Http">http</a> <a href="/w/Content_type">тип содержимого</a>.</dd></dl><ol><li>шаблоны: lt: lazy text, st: strict text</li><li>шаблоны для текста с разделителем левого поля '|': lbt (lazy), sbt (strict)</li></ol><h4>Локализуемые сообщения</h4><p>См. ссылку</p>
<p>Сообщения приложения Yesod можно локализовать (<a href="/w/I18n">i18n</a> ). Они должны храниться в папке сообщений, в файлах с именами на основе <a href="/w/International_Organization_for_Standardization">ISO</a>, как <iso-language>.msg</p>
<p>Записи сообщений следуют шаблону <a href="/w/Extended_Backus%E2%80%93Naur_form">EBNF</a> :</p><pre>- EBNF: идентификатор, {'', параметр, '@', тип}, ":", текст с интерполяциями. ArticleUnexistent param @ Int64: конструкторы сообщений, которые не существует в статье # {param}</pre><ul class="ul_main"><li>, формируются перед сообщением "Msg" идентификатор метки сообщения.</li><li>тип данных сообщения формируется добавлением "Message" к имени основного типа.</li></ul><pre>- в коде myMsg :: MyAppMessage - тип данных, добавляющий "Message" к основному типу myMsg = MsgArticleUnexistent myArticleId - конструктор, добавляющий "Msg" к сообщению. label - в шаблонах виджетов _ {MsgArticleUnexistent myArticleId}</pre><p>Фактическая поддержка <a href="/w/I18n">i18n</a> отсутствует в шаблоне приложения стека. Вы должны добавить <code>mkMessage «MyApp» messagesFolder isoLangDefault</code>в файл «Foundation.hs», чтобы создать экземпляры сообщений.</p><h4>Навигационные крошки</h4><ul class="ul_main"><li>Навигация <a href="/w/Breadcrumb_(navigation)">Навигационные крошки</a>. Вы должны предоставить экземпляр YesodBreadcrumbs для сайта, где хлебная крошка функции генератора должна возвращать для каждого маршрута заголовок и родительский. Затем хлебные крошки функции запроса вернут текущий заголовок маршрута и пары предков (маршрут, заголовок).</li></ul><h4>XML Sitemap поисковой системы</h4><ul class="ul_main"><li>Поисковые системы <a href="/w/Sitemap#XML_Sitemaps">XML Sitemaps</a>, где карта сайта возвращает XML Sitemap как ответ <a href="/w/Http">http</a>, с маршрутами, которые мы хотим, чтобы поисковые системы сканировали, и атрибутами для указания сканеру из предоставленного списка записей SitemapUrl.</li></ul><h4>Представления веб-каналов</h4><ul class="ul_main"><li><a href="/w/Web_feed">Веб-каналы</a> просмотров (<a href="/w/RDF_Site_Summary">RSS</a> / <a href="/w/Atom_(standard)">Atom</a> ). У вас есть обработчики, которые возвращают содержимое RepRss, RepAtom или двойное содержимое RepAtomRss (выбирается в списке предпочтительных типов содержимого заголовков accept) из заданной структуры Feed.</li></ul><h3>Модель</h3><h4>Использование изменяемых данных в памяти ( в типе данных фундамента)</h4><p>Например количество посетителей. См. Ссылку</p><h4>Уровень базы данных</h4><ul class="ul_main"><li>persistent - это имя уровня доступа к базе данных с шаблонами для генерации типов для сущностей и ключей, а также для инициализации схемы.</li></ul><p>Для <249 существует поддержка первого класса.>PostgreSQL</a>, <a href="/w/SQLite">SQLite</a>, <a href="/w/MongoDB">MongoDB</a>, <a href="/w/CouchDB">CouchDB</a> и <a href="/w/MySQL">MySQL</a> с экспериментальной поддержкой <a href="/w/Redis">Redis</a>.</p>
<p>Структура базы данных описана в шаблоне, в котором перечислены сущности, поля и ограничения.</p><ul class="ul_main"><li>Для каждой указанной сущности создается столбец с целочисленным ключом «id» с атрибутами автоинкремента и первичного индекса с псевдонимом типа, добавляющим Id к имени сущности</li><li>Для каждой перечисленной сущности создается тип записи, названный в качестве сущности, если имена полей записи состоят из префикса имени сущности перед именем поля, например «personName». Тип EntityField "PersonName" также создается для ссылок на внешний ключ из других сущностей.</li><li>Существует автоматический механизм миграции схемы базы данных для обновлений схемы БД, который для успешного выполнения требует при добавлении столбцов в существующие таблицы, для определения ограничений значения столбца по умолчанию с нотацией уровня sql.</li><li>"Максимум одно" количество элементов имеет специальный механизм вокруг типа Checkmark.</li><li>Слабые сущности (дочерние элементы в жизни ограничены владельцем- дочерние отношения) не имеют специальной поддержки для триггеров каскадного удаления, но есть функции для удаления каскада вручную в модуле Database.Persist.Class.</li></ul><dl><dt>автоматическое создание таблицы, обновление схемы и миграция таблицы</dt><dd>Модификации сущностей шаблон производит обновление схемы с автоматическим созданием таблицы и миграцию для СУБД , которые поддерживают команды «ALTER TABLE» <a href="/w/SQL">SQL</a> в процедуре migrateAll, созданной из содержимого шаблона. См. «Миграции» в исх. искать информацию о миграции <a href="/w/Database_management_system">СУБД</a>.</dd></dl><pre>share [mkPersist sqlSettings, mkMigrate «migrateAll» - генерирует процедуру миграции с указанным именем] [persist | Пользователь - имя таблицы и тип записи объекта - неявный автоинкремент столбца «id» в качестве первичного ключа, типизированный UserId идентификатор Text - относится к db. столбец таблицы «идент»; - генерирует поле записи с префиксом к имени таблицы как "userIdent" пароль. Текст Может быть - Может быть указывает на поле, допускающее значение NULL. Уникальный идентификатор пользователя - уникальное ограничение с пробелом sep. последовательность полей Электронная почта - имя таблицы и тип записи объекта - неявный автоинкремент столбца «id» в качестве первичного ключа, введенный EmailId email Text пользователь UserId - внешний ключ путем указания других таблиц Типы EntityField verkey Текст Может быть newAddedColumn Text "default = 'sometext' :: изменение символа "- уровень sql Ограничение по умолчанию UniqueEmail email - уникальное ограничение |]</pre><ul class="ul_main"><li>Esqueleto: это уровень комбинаторов haskell для генерации корректных реляционных запросов к постоянным.</li></ul><p>Пример для постоянных запросов rawSQL и Esqueleto.</p><h3>Электронная почта</h3><p>Следующие пакеты являются частью платформы yesod:</p><ul class="ul_main"><li>email-validate: проверка адреса электронной почты.</li><li>mime-mail: составление и отправка <a href="/w/MIME">MIME</a> сообщения электронной почты.</li></ul><h3>Facebook</h3><ul class="ul_main"><li>Полезные связующие функции между библиотекой fb и Yesod.</li></ul><div class="ht">Цикл разработки</div><p>Новые приложения Yesod генерируются из шаблонов инструмента HaskellStack, заменяя предыдущие команда "yesod init"</p>
<p>Приложение на основе стека. к именам шаблонов добавляется префикс yesod как "yesod- {minimal | postgres | sqlite | mysql | mongo |...}"</p><ul class="ul_main"><li>Поскольку HaskellStack по умолчанию использует репозиторий стека, дополнительные пакеты из репозитория хакерства должны упоминаться в " stack.yaml "extra-deps раздел.</li><li>Вы можете настроить пакеты в локальную подпапку. Они должны быть упомянуты в разделе пакетов "stack.yaml".</li></ul><h3>Инструмент «Помощник Yesod»</h3><ul class="ul_main"><li>Вспомогательный инструмент yesod <ul class="ul_main"><li><code>yesod devel</code>запускается с сайта проекта, перекомпилирует и перезапускает проект на каждое изменение дерева файлов.</li><li><code>add-handler yesod</code>добавляет в проект новый обработчик и модуль, добавляя предложение импорта для обработчика в модуле «Application».</li></ul></li></ul><h3>Развертывание с помощью Keter: сервер веб-приложений монитор и обратный прокси-сервер</h3><p>См. ссылки.</p>
<p>Keter - это процесс как служба, который обрабатывает развертывание и перезапуск серверов веб-приложений Yesod  и, согласно <a href="/w/Web_app">веб-приложение</a>, создание базы данных для <a href="/w/PostgreSQL">PostgreSQL</a>.</p>
<p>Консольная команда <code>yesod keter</code>упаковывает веб-приложение. в качестве пакета кетер для загрузки в папку кетер с именем «входящие».</p>
<p>Кетер следит за «входящей» папкой и распаковывает приложение. к временному, затем назначает веб-приложению порт для прослушивания и запускает его.</p>
<p>Первоначально он работал с <a href="/w/Nginx">Nginx</a> как <a href="/w/Reverse_proxy">обратным прокси</a> (версия кетера 0.1 *), добавляя записи <a href="/w/Virtual_hosting">виртуального сервера</a> в его конфигурацию и создавая <a href="/w/Nginx">Nginx</a> перезагрузите его, но теперь сам Keter предоставляет свои собственные функции <a href="/w/Reverse_proxy">обратного прокси</a>, удаляя зависимость Nginx и выступая в качестве основного веб-сервера.</p>
<p>Старая документация (на основе Nginx).</p><div class="ht">Интеграция с <a href="/w/JavaScript">JavaScript</a>, созданным на основе функциональных языков</div><p>См. Ссылку</p><div class="ht">См. Также</div><ul class="ul_main"><li><img alt="" class="noviewer" height="28" src="//upload.wikimedia.org/wikipedia/commons/thumb/3/31/Free_and_open-source_software_logo_%282009%29.svg/28px-Free_and_open-source_software_logo_%282009%29.svg.png" width="28"/>Портал бесплатного программного обеспечения с открытым исходным кодом </li></ul><ul class="ul_main"><li><a href="/w/Snap_(web_framework)">Snap ( web framework)</a> </li></ul><div class="ht">Ссылки</div><div class="ht">Внешние ссылки</div><ul class="ul_main"><li><a href="https://www.yesodweb.com/" rel="nofollow">Официальный сайт</a> <img alt="Измените это в Викиданных " height="10" src="//upload.wikimedia.org/wikipedia/en/thumb/8/8a/OOjs_UI_icon_edit-ltr-progressive.svg/10px-OOjs_UI_icon_edit-ltr-progressive.svg.png" width="10"/> </li><li>Презентации: <a href="http://www.infoq.com/presentations/Yesod" rel="nofollow">InfoQ</a>, <a href="https://skillsmatter.com/skillscasts/3521-scalable-web-applications-with-yesod" rel="nofollow">Haskell eXchange 2012</a> </li><li>Слайды: <a href="http://www.acm.jhu.edu/~nwf/fwh/08_yesod.pdf" rel="nofollow">ACM в Johns Hopkins Univ. - Обновленные веб-сайты с помощью Yesod</a> </li><li>ScreenCast: <a href="https://vimeo.com/39646807" rel="nofollow">Yesod 1.0 на Vimeo</a> </li><li><a href="http://shop.oreilly.com/product/0636920023142.do" rel="nofollow">Электронная книга O'Reilly - Разработка веб-приложений с помощью Haskell и Yesod - Безопасная веб-разработка</a> </li><li>Вопросы и ответы: <a href="https://stackoverflow.com/questions/tagged/yesod" rel="nofollow">StackOverflow. com - Yesod с тегами QA</a> </li></ul><h3>Руководства по блогам</h3><ul class="ul_main"><li><a href="http://fpcomplete.com/yesod-tutorial-1-my-first-web-site/" rel="nofollow">FPComplete.com - Мой первый веб-сайт</a>, <a href="http://fpcomplete.com/yesod-tutorial-2-playing-with-routes-and-links/" rel="nofollow">Игра с маршрутами и ссылками</a> </li><li><a href="http://yannesposito.com/Scratch/en/blog/Yesod-tutorial-for-newbies/" rel="nofollow">Yesod для новичков</a> </li><li><a href="http://hamberg.no/erlend/posts/2012-08-23-handlertoio-yesod.html" rel="nofollow">hamberg.no - handlerToIO: используйте forkIO в обработчиках Yesod</a> </li></ul><h3>Сравнения</h3><ul class="ul_main"><li><a href="http://www.haskell.org/haskellwiki/Web/Frameworks" rel="nofollow">HaskellWiki - веб-фреймворки Haskell</a> </li><li><a href="http://softwaresimply.blogspot.com.es/2012/04/hopefully-fair-and-useful-comparison-of.html" rel="nofollow">Надеюсь, честное и полезное сравнение веб-фреймворков Haskell</a> </li><li><a href="http://www.cs.kent.ac.uk/~nccb/rails-yesod-slides.pdf" rel="nofollow">Univ. Кента - Сравнение динамических и статических языковых подходов с веб-фреймворками - Yesod против Ruby on Rails</a> </li></ul><h3>Другие языки</h3><ul class="ul_main"><li>Haskell Biblio. - Yesod (на испанском языке) Univ. из <a href="/w/Cadiz">Cadiz</a> </li></ul><h3>В дистрибутивах GNU / Linux</h3><ul class="ul_main"><li><a href="http://packages.debian.org/search?keywords=yesodsearchon=namessection=all" rel="nofollow">Yesod в Debian</a> </li><li><a href="http://packages.ubuntu.com/search?suite=precisesearchon=nameskeywords=yesod" rel="nofollow">Yesod в Ubuntu 12.04 «точный»</a> </li></ul></div>
</div>
</div>
<div class="body">
<div class="update">Последняя правка сделана 2021-06-22 13:00:21</div>
<div>Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).</div></div>
<div class="schl" style="background:#0e365a;height:162px;">
<div class="body" style="color:#fff;padding:34px 0px;margin-top:36px;font-size:16px;">
<div>Обратная связь: support@alphapedia.ru</div>
<div style="margin:14px 0px;"><a style="color:#fff;" href="https://alphapedia.ru/terms.html" rel="nofollow">Соглашение</a></div>
<div><a style="color:#fff;" href="https://alphapedia.ru/about.html" rel="nofollow">О проекте</a></div>
</div>
<!--LiveInternet counter--><img id="licnt23FE" width="1" height="0" style="border:0" 
title="LiveInternet"
src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAEALAAAAAABAAEAAAIBTAA7"
alt=""/><script>(function(d,s){d.getElementById("licnt23FE").src=
"https://counter.yadro.ru/hit?t44.6;r"+escape(d.referrer)+
((typeof(s)=="undefined")?"":";s"+s.width+"*"+s.height+"*"+
(s.colorDepth?s.colorDepth:s.pixelDepth))+";u"+escape(d.URL)+
";h"+escape(d.title.substring(0,150))+";"+Math.random()})
(document,screen)</script><!--/LiveInternet-->
</div>
<script>
function sub() {    
var request = new XMLHttpRequest();
request.open('GET', '/action/action.php?request=sub');  
request.send();
request.onreadystatechange = function () {
if (request.readyState == 4 && request.status == 200){
var response = request.responseText;
document.getElementById("action").innerHTML = response;
var script = document.createElement("script");
script.src = "https://alphapedia.ru/javascript/main.js";
document.getElementsByClassName("javascript")[0].appendChild(script);   
}
}    
}
function search_() {    
var request = new XMLHttpRequest();
request.open('GET', '/action/action.php?request=search_');  
request.send();
request.onreadystatechange = function () {
if (request.readyState == 4 && request.status == 200){
var response = request.responseText;
document.getElementById("action").innerHTML = response;  
var script = document.createElement("script");
script.src = "https://alphapedia.ru/javascript/main.js";
document.getElementsByClassName("javascript")[0].appendChild(script);   
}
}    
}
window.onload = function() {
document.getElementById("a1").innerHTML = "<img onclick=\"window.open('https://quor.ru/constructor?alias=manshortfull', '_blank');\" style=\"cursor:pointer;max-width:100%;margin:2px 0 2px;\" src=\"/q.jpg\" alt=\"\">"; 
};
</script>
<div id="action"></div>
</body>
</html>