Yesod ( pronunciación hebrea: [ jeˈsod ] ; hebreo : יְסוֺד , "Fundamento") es un marco web basado en el lenguaje de programación Haskell para el desarrollo productivo de aplicaciones web de alto rendimiento, basadas en el modelo de transferencia de estado representacional ( REST ) con seguridad de tipos (donde los localizadores uniformes de recursos ( URL ) identifican los recursos y los métodos del Protocolo de transferencia de hipertexto (HTTP) identifican las transiciones), desarrollado por Michael Snoyman y otros. Es un software libre y de código abierto publicado bajo una licencia MIT .
Yesod se basa en plantillas para generar instancias de entidades listadas y funciones de procesamiento de contenido dinámico, a través de construcciones Template Haskell para alojar plantillas de contenido de lenguaje específico de dominio (eDSL) llamadas QuasiQuotes, donde el contenido se traduce en expresiones de código mediante instrucciones de metaprogramación . [ 2 ]
También existen plantillas de fragmentos de lenguaje similares a las de la web que admiten interpolaciones de expresiones de código, lo que permite que se verifiquen completamente los tipos en tiempo de compilación.
Yesod divide sus funciones en bibliotecas separadas ( base de datos , renderizado HTML, formularios, etc.) para que las funciones se puedan usar según sea necesario.
Arquitectura MVC
Yesod utiliza el patrón de diseño de software modelo-vista-controlador (MVC) para sus interfaces de usuario .
Controlador
Interfaz del servidor
Yesod utiliza una interfaz de aplicación web (WAI), [ 3 ] un tipo de interfaz de programación de aplicaciones ( API ), para aislar los servlets , también conocidos como aplicaciones web, de los servidores, con manejadores para los protocolos de servidor Common Gateway Interface (CGI), [ 4 ] FastCGI , [ 5 ] Simple Common Gateway Interface (SCGI), [ 6 ] Warp, [ 7 ] Launch (abre como URL local en el navegador predeterminado, cerrando el servidor cuando se cierra la ventana), [ 8 ]
El tipo de base
Véase la referencia [ 9 ] . Yesod requiere un tipo de datos que instancie las clases modelo-vista-controlador . Este se denomina tipo base . En el ejemplo siguiente, se llama "MyApp".
El modelo REST identifica un recurso web mediante una ruta web. En este caso, los recursos REST reciben nombres con el sufijo R (como "HomeR") y se listan en una plantilla de descripción de mapa del sitio de parseRoutes . A partir de esta lista, se derivan los nombres de las rutas y los nombres de los manejadores de despacho.
Yesod utiliza la metaprogramación Template Haskell para generar código a partir de plantillas en tiempo de compilación, asegurando que los nombres en las plantillas coincidan y que todo pase la verificación de tipos (por ejemplo, nombres de recursos web y nombres de manejadores).
Al insertar una llamada mkYesod , se llamarán a las primitivas de Template Haskell para generar el código correspondiente a los miembros del tipo de ruta y las instancias de las clases del controlador de despacho para despachar las llamadas GET a la ruta HomeR a una rutina llamada que las compone ambas como "getHomeR", esperando un manejador existente que coincida con el nombre.
Hola Mundo
Ejemplo de programa "¡Hola, mundo!" basado en una interfaz de servidor CGI ( Common Gateway Interface ) (los tipos de manejadores han cambiado, pero la filosofía se mantiene):
{- archivo wai-cgi-hello.hs -} {-# LANGUAGE PackageImports, TypeFamilies, QuasiQuotes, MultiParamTypeClasses, TemplateHaskell, OverloadedStrings #-} import "wai" Network.Wai import "wai-extra" Network.Wai.Handler.CGI ( run ) -- manejador WAI intercambiableimport "yesod" Yesod import "yesod-core" Yesod.Handler ( getRequest ) import "text" Data.Text ( Text ) import "shakespeare" Text.Cassius ( Color ( .. ), colorBlack )-- los datos de tipo Foundation MyApp = MyApp-- plantilla de mapa del sitio, lista de ruta, nombre del recurso y métodos aceptados -- `mkYesod` toma el nombre del tipo de base como parámetro para la composición de nombres de las funciones de despacho mkYesod "MyApp" [ parseRoutes | / HomeR GET | ]instancia Yesod MyApp-- plantilla CSS estructurada con sangría myStyle :: [ Texto ] → CssUrl url myStyle paramStyle = [ cassius | . box border : 1 px solid # { boxColor } | ] donde boxColor = case paramStyle of [ "high-contrast" ] → colorBlack _ → Color 0 0 255-- plantilla HTML estructurada con sangría myHtml :: [( Texto , Texto )] → HtmlUrl url myHtml params = [ hamlet |<!-- La indentación, o la falta de ella, bajo las etiquetas o comandos iniciales (el prefijo ' $ ') describe el contenido o la estructura del árbol de secuencia --> <!-- Los prefijos '.' o ' # ' en las etiquetas introducen valores de atributo "class" o "id" con estilo CSS --> <!-- La interpolación de expresiones haskell sigue la sintaxis #{ expr } de las "plantillas shakespeare" --><p> ¡ Hola mundo ! Hay < span.box > #{ length params} parámetros </span> : $ if null params <p> Nada que listar $ 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 -- agregando widgets a la mónada Widget (una mónada ''Writer'') setTitle "Ejemplo de Yesod" toWidgetHead $ myStyle paramStyle toWidgetBody $ myHtml params-- existen variantes de la función ''run'' para diferentes manejadores WAIprincipal = toWaiApp MyApp >>= ejecutar# Prueba CGI 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 Recursos, rutas, manejadores de métodos HTTP
Véase la referencia [ 10 ] [ 11 ] Yesod sigue el modelo de transferencia de estado representacional de acceso a documentos web, identificando documentos y directorios como recursos con un constructor Route, nombrado con un sufijo R mayúscula (por ejemplo, HomeR).
- La tabla de rutas
- La plantilla parseRoutes debe enumerar los recursos especificando las partes de la ruta, el nombre del recurso y los métodos de despacho que se aceptarán.
Es posible capturar segmentos de URL como parámetro especificando el prefijo '#' para la captura de un solo segmento o '*' para la captura de varios segmentos, seguido del tipo de parámetro.
-- dado un tipo de base MyAppmkYesod "MyApp" [ parseRoutes | / HomeR -- no se especifican métodos http: se aceptan todos los métodos / blog BlogR GET POST-- el prefijo '#' especifica el segmento de ruta como un parámetro del controlador de ruta / artículo /# ArticleId ArticleR GET PUT-- el prefijo '*' especifica el parámetro como una secuencia de fragmentos de ruta / rama /* Textos BranchR GET-- para simplificar la gramática, los tipos compuestos deben usar un alias, por ejemplo, type Texts for ''[Text]'' | ]- Al aplicar la plantilla anterior se generan los siguientes constructores de ruta:
Ruta de datos MyApp = HomeR -- referenciada en plantillas como: @{HomeR} | BlogR -- en plantillas: @{BlogR} | ArticleR ArticleId -- en plantillas: @{ArticleR myArticleId} | BranchR Texts -- en plantillas: @{BranchR myBranchSegments}- Para cada método HTTP compatible , se debe crear una función controladora que coincida con los nombres de despacho generados por mkYesod a partir de la plantilla parseRoutes , anteponiendo el nombre del método (o el prefijo "handler" si no se especifica ningún método) al recurso, como se describe (los tipos de controladores de las versiones actuales han cambiado, pero la filosofía se mantiene):
-- para "/ HomeR" -- no se especifican métodos http ⇒ solo un manejador con el prefijo ''handler'' handlerHomeR :: HasReps t ⇒ Handler t-- para "/blog BlogR GET POST" getBlogR :: HasReps t ⇒ Handler t postBlogR :: HasReps t ⇒ Handler t-- para "/artículo/#ArticleId ArticleR GET PUT" getArticleR :: HasReps t ⇒ ArticleId → Handler t putArticleR :: HasReps t ⇒ ArticleId → Handler tDatos de la solicitud, parámetros, cookies, idiomas, otra información de encabezado
Véase la referencia [ 10 ] .
Autenticación, autorización
Véase la referencia [ 12 ] Complementos de autenticación: OpenID , BrowserID , Email, GoogleEmail, HashDB, RpxNow. [ 13 ]
- Existe una configuración importante para la redirección automática después de la autenticación. [ 14 ]
Sesiones
Véase la referencia [ 15 ] Backends de sesión: ClientSession [ 16 ] (almacena la sesión en una cookie), ServerSession [ 17 ] [ 18 ] (almacena la mayor parte de los datos de la sesión en el servidor)
- Para evitar una sobrecarga de ancho de banda excesiva, los sitios de producción pueden servir su contenido estático desde un nombre de dominio separado para evitar la sobrecarga de transmitir la cookie de sesión para cada solicitud .
Mensajes de sesión
Se puede almacenar un mensaje de éxito, fracaso o indicativo ( setMessage ) en la sesión y se mostrará, si existe, mediante la rutina default_layoutdefault_layout.hamlet a través de la plantilla, borrándose al consultarla. [ 19 ]
Subsitios
Subsitios con prefijos URL comunes para flujos de trabajo, servicio de archivos o particionamiento de sitios. Véase la referencia [ 20 ] [ 21 ].
Subsitios integrados: Estático, [ 22 ] [ 23 ] Autenticación [ 24 ]
Procesamiento de formularios, generación de diseños
Véase la referencia [ 25 ] .
El tipo de formulario aquí es un objeto que se usa en el controlador para analizar y procesar los campos del formulario ingresados por el usuario y generar un par (FormResult, Widget), donde el widget contiene el diseño de la siguiente representación del formulario con mensajes de error y marcas. También se puede usar para generar un nuevo formulario con campos en blanco o valores predeterminados.
El tipo de formulario adopta la forma de una función de un fragmento HTML que se incrustará en la vista y que contendrá campos ocultos por motivos de seguridad.
Se genera un objeto de formulario a partir de una composición aplicativa - monádica de campos para un análisis secuencial combinado de las entradas de campo.
Existen tres tipos de formularios:
- Aplicativo (con formato tabular),
- Monádico (con estilo de diseño libre), ambos en el módulo Yesod.Form.Functions,
- Entrada (solo para análisis, no se genera ninguna vista) en el módulo Yesod.Form.Input.
Los generadores de campos, cuyos nombres se componen del tipo de formulario inicial (a|m|i)seguido de(req|opt){- required or optional -} , tienen un componente fieldParse y otro fieldView. [ 26 ]
- La función
runForm{Post|Get}analiza los campos del formulario y genera un par (FormResult, Widget) a partir de las vistas, ofreciendo un nuevo widget con los valores de los campos recibidos como valores predeterminados. El sufijo de la función es el método HTTP utilizado para el envío del formulario. - mientras
generateForm{Post|Get}ignora las entradas del cliente y genera un widget de formulario en blanco o con valores predeterminados. [ 27 ]
Los parámetros y tipos de función reales han cambiado a lo largo de las versiones de Yesod. Consulte las firmas del libro y las bibliotecas de Yesod.
La magia está en la instancia Applicative del tipo de datos FormResult , donde (<*>) recopila los mensajes de error para el caso de valores de resultado [ 28 ].FormFailure [textErrMsg]
Las formas monádicas permiten un diseño de forma libre y un mejor tratamiento de los miembros hiddenField . [ 25 ]
Ejemplo de una forma aplicativa [ 29 ] :
-- un registro para los datos de los campos de nuestro formulario Persona = Persona { personName :: Text , personAge :: Int , personLikings :: Maybe Text }-- El tipo Form tiene un parámetro adicional para insertar un fragmento HTML, que contiene un campo oculto de token CSRF para el tipo de seguridad Form sub master x = Html → MForm sub master ( FormResult x , Widget ){- -- para mensajes en funciones de validación: @param master: instancia de yesod para usar en renderMessage (devuelto por getYesod del manejador) @param languages: idiomas de página para usar en renderMessage-- registro de valores predeterminados opcional: @param mbPersonDefaults: Solo defaults_record, o Nothing para un formulario en blanco -}personForm :: MyFoundationType → [ Texto ] → Quizás Persona → Formulario sub maestro Persona {- ''aopt'' (componente AForm de campo opcional) para campos "Quizás", ''areq'' (componente AForm de campo obligatorio) insertará el atributo "obligatorio" -} personForm maestro idiomas mbPersonDefaults = renderTable $ Persona <$> areq textField fldSettingsName mbNameDefault <*> areq customPersonAgeField fldSettingsAge mbAgeDefault <*> aopt textareaField fldSettingsLikings mbLikingsDefault donde mbNameDefault = fmap personName mbPersonDefaults mbAgeDefault = fmap personAge mbPersonDefaults mbLikingsDefault = fmap personLikings mbPersonDefaults-- "fieldSettingsLabel" devuelve un registro fieldSettings inicial -- recientemente el registro "FieldSettings" se puede definir a partir de una etiqueta String ya que implementa IsString fldSettingsName = ( fieldSettingsLabel MsgName ) { fsAttrs = [( "maxlength" , "20" )]} fldSettingsAge = fieldSettingsLabel MsgAge fldSettingsLikings = ( fieldSettingsLabel MsgLikings ) { fsAttrs = [( "cols" , "40" ),( "rows" , "10" )]}customPersonAgeField = comprobar validateAge intFieldvalidarEdad y | y < 18 = Izquierda $ renderMessage master languages MsgUnderAge | de lo contrario = Derecha yVista
Los tipos mostrados corresponden a una versión anterior, pero la filosofía se mantiene.
La mónada Handler devuelve contenido en uno o más de varios formatos como componentes de tipos que implementan la clase HasReps [ 30 ] { RepHtml, RepJson, RepXml, RepPlain , el dual RepHtmlJson , un par o lista de pares , ..}. [ 31 ] [ 32 ] Ejemplos de Json: [ 33 ] [ 34 ] [ 35 ][(ContentType, Content)]
La implementación predeterminada de HasReps de chooseRep elige la representación del documento que se devolverá de acuerdo con la lista de tipos de contenido preferidos del encabezado de aceptación del cliente . [ 30 ]
- Los widgets [ 36 ] son fragmentos de código DOM HTML creados mediante comandos específicos (por ejemplo, setTitle) o a partir de plantillas de estructura ( HTML ) / comportamiento ( JavaScript ) / estilo ( CSS ), cuyos tipos instancian las clases ToWidget, ToWidgetHead o ToWidgetBody.
Una mónada Widget, [ 37 ] basada en una Writer [ 38 ] y argumento para defaultLayout , facilita la unión de los widgets.
Plantillas basadas en sangría para marcado estructurado en árbol.
- El cuasiconscriptor hamlet (un analizador para código Template Haskell en tiempo de compilación ) [ 2 ] [ 39 ] especificado en la sintaxis de corchetes TH Oxford introduce una plantilla HTML estructurada basada en indentación. (Véase el documento [ 40 ] ). [ 41 ]
[qq| ... |]
El símbolo '$' antepone a las líneas de sentencias lógicas.
Las etiquetas de cierre automático se generan únicamente para la etiqueta situada en la posición de inicio de la línea.
- El cuasicitador whamlet devuelve una expresión Widget. (se guarda en Widget antes de [hamlet|..|]).
toWidget [hamlet| $ doctype 5 < html > <!-- solo la etiqueta al principio de la línea se cerrará automáticamente --> <!-- Los prefijos '.' o ' # ' en las etiquetas introducen nombres de clase/id, al estilo CSS --> <!-- El prefijo ":boolVar:" en los atributos los hace generados condicionalmente --> <!-- la interpolación de expresiones haskell sigue la sintaxis de "plantillas shakespearianas" introducida en la sección así denominada --><head> <title> # { pageTitle } - Mi sitio < 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 } |] Interpolación de plantillas - Plantillas shakespearianas
Véase la referencia [ 40 ] Estas son plantillas de vista de contenido que siguen un patrón de sustitución común de expresiones de código dentro de llaves con un prefijo de caracteres diferente para referirse a
- expresiones de plantilla con
^{...} - se refiere a otras plantillas del mismo tipo, con parámetros dados como
^{template params}, - expresiones de ruta con
@{...} - URL seguras (escritas) como
@{HomeR}, - expresiones de mensajes con
_{...} - Representación del mensaje i18n como
_{MsgMessageLabel params} - otras expresiones de Haskell con
#{...} - Representación de expresiones Haskell como
#{haskell_expression}qué tipo debe ser convertible
- En el caso de las plantillas HTML de Hamlet , el tipo de expresión debe ser una instancia de Text.Blaze.ToMarkup [ 42 ].
- En el caso de las plantillas CSS , el tipo de expresión debe ser una instancia de Text.Cassius.ToCss [ 43 ].
- en el caso de plantillas JavaScript , el tipo de expresión debe ser una instancia de Text.Julius.ToJavascript [ 44 ]
- en el caso de definiciones de mensajes i18n
<isoLanguage>(en archivos ".msg") con interpolaciones de parámetros, el tipo de expresión debe ser una instancia de Text.Shakespeare.I18N.ToMessage [ 45 ] - en el caso de plantillas de texto/plano (para uso en correos electrónicos), el tipo de expresión debe ser una instancia de Text.Shakespeare.Text.ToText [ 46 ]
El uso de texto que no sea en inglés en expresiones requiere el uso del tipo Text , que admite Unicode , ya que la representación del tipo String del compilador Glasgow Haskell (GHC) muestra los caracteres que no son ASCII como códigos numéricos escapados.
- Plantillas de archivos externos
- En tiempo de compilación: El contenido de la plantilla se puede cargar desde archivos externos mediante llamadas de empalme en tiempo de compilación como $(expr) . [ 47 ]
- en tiempo de ejecución: Hay un modo de recarga para volver a analizar los archivos de plantilla externos en cada llamada al servicio, excepto para las plantillas de hamlet HTML : Consulte el documento [ 48 ] .
Otras plantillas
- para JavaScript, CoffeeScript, Roy
- El cuasiquoter de Julius : introduce una plantilla de JavaScript. [ 49 ] Las variantes de JavaScript CoffeeScript y Roy-language [ 50 ] también tienen cuasiquoters específicos . [ 2 ] [ 49 ]
- para CSS
- El cuasiquoter de Cassius : introduce una plantilla CSS con estructura basada en indentación. [ 51 ]
- El cuasiquoter lucius : introduce una plantilla CSS con sintaxis estándar más sustituciones al estilo de las plantillas shakespeare. [ 52 ]
- Plantillas TypeScript y JSX
- Los cuasiquoters tsc y tscJSX . Solo en derivados de UNIX ( aún no en Windows ). [ 53 ]
- plantillas de texto/plano
- para correo electrónico o texto plano tipo de contenido http . [ 54 ]
- plantillas: lt : texto perezoso, st : texto estricto
- Plantillas para texto con un delimitador de margen izquierdo '|': lbt (flexible), sbt (estricto)
Mensajes localizables
Véase la referencia [ 55 ] .
Los mensajes de la aplicación Yesod son localizables ( i18n ). Deben guardarse en la carpeta de mensajes , en archivos con nombres basados en la ISO , como <idioma-iso> .msg .
Las entradas de mensajes siguen el patrón EBNF :
-- EBNF: identificador, {' ', parámetro, '@', tipo}, ":", texto con interpolaciones ArticleUnexistent param @ Int64 : artículo inexistente # { param }- Los constructores de mensajes se forman anteponiendo "Msg" al identificador de la etiqueta del mensaje.
- El tipo de datos de mensaje se forma añadiendo "Mensaje" al nombre del tipo base.
-- en el código myMsg :: MyAppMessage -- tipo de datos que agrega "Message" al tipo base myMsg = MsgArticleUnexistent myArticleId -- constructor que antepone "Msg" a msg. label-- en plantillas de widgets _ { MsgArticleUnexistent myArticleId }Falta la compatibilidad real con i18n en la plantilla de la aplicación Stack . Debe agregarse al archivo "Foundation.hs" para que se muestren los mensajes. [ 56 ]mkMessage "MyApp" messagesFolder isoLangDefault
ruta de navegación
- Rutas de navegación . [ 57 ] Se debe proporcionar una instancia de YesodBreadcrumbs para el sitio donde la función generadora breadcrumb debe devolver para cada ruta un título y uno padre. Luego, la función de consulta breadcrumbs devolverá el título de la ruta actual y los pares (ruta, título) de sus ancestros.
Mapa del sitio XML del motor de búsqueda
- Mapas del sitio XML de los motores de búsqueda , [ 58 ] donde sitemap devuelve un mapa del sitio XML como respuesta http , con las rutas que queremos que los motores de búsqueda rastreen y atributos para instruir al rastreador, a partir de una lista proporcionada de registros SitemapUrl .
Visualizaciones de la fuente web
- Vistas de fuentes web ( RDF Site Summary (RSS) – Atom ). [ 59 ] Los manejadores devuelven contenido RepRss, RepAtom o RepAtomRss dual (que se seleccionará en la lista de tipos de contenido preferidos de los encabezados de aceptación ) de una estructura de fuente dada .
Modelo
Utilizando datos mutables en memoria (en el tipo de datos base)
Por ejemplo, un recuento de visitantes. Véase la referencia [ 60 ] .
La capa de base de datos
- persistente es el nombre de la capa de acceso a la base de datos con plantillas para generar tipos para entidades y claves, así como la inicialización del esquema. [ 61 ] [ 62 ] [ 63 ]
Existe soporte de primera clase para PostgreSQL , SQLite , MongoDB , CouchDB y MySQL , con soporte experimental para Redis . [ 61 ]
El diseño de la base de datos se describe en una plantilla que enumera las entidades, los campos y las restricciones. [ 64 ]
- Para cada entidad listada, se genera una columna de clave entera "id" con atributos de autoincremento e índice primario, con un alias de tipo que agrega "Id" al nombre de la entidad.
- Para cada entidad listada, se genera un tipo de registro con el mismo nombre que la entidad, donde los nombres de los campos se componen anteponiendo el nombre de la entidad al nombre del campo, como por ejemplo "personName". También se genera un tipo de campo de entidad "PersonName" para referenciar claves foráneas desde otras entidades.
- Existe un mecanismo automático de migración de esquemas de base de datos para las actualizaciones de esquemas de base de datos, que, para tener éxito, requiere, al agregar columnas a tablas existentes, especificar restricciones de valor de columna predeterminado con notación de nivel SQL . [ 65 ]
- La cardinalidad "como máximo uno" tiene un mecanismo especial en torno al tipo Checkmark. [ 66 ]
- Las entidades débiles (hijos en relaciones propietario-hijo con restricción de vida) no tienen soporte especial para los disparadores de eliminación en cascada , pero hay funciones para eliminar en cascada manualmente en el módulo Database.Persist.Class. [ 67 ]
- Creación automática de tablas, actualización de esquemas y migración de tablas.
- Las modificaciones de la plantilla de entidades producen una actualización del esquema con creación automática de tablas y migración para los sistemas de gestión de bases de datos (DBMS ) que admiten comandos SQL "ALTER TABLE" en un procedimiento migrateAll , generado a partir del contenido de la plantilla. Consulte "Migraciones" en la referencia [ 61 ] para buscar sistemas de gestión de bases de datos compatibles con migraciones .
compartir [ mkPersist sqlSettings , mkMigrate "migrateAll" -- genera el procedimiento de migración con el nombre especificado ] [ persistir |Usuario -- nombre de tabla y tipo de registro de entidad -- columna de autoincremento implícito "id" como clave primaria, tipo UserId ident Texto -- se refiere a la columna de la tabla de la base de datos "ident"; -- genera un campo de registro que antepone el nombre de la tabla como "userIdent" contraseña Texto Quizás -- Quizás indica campo anulable UniqueUser ident -- restricción única con secuencia de campos separados por espaciosCorreo electrónico : nombre de la tabla y tipo de registro de entidad ; columna de autoincremento implícito "id" como clave primaria, tipo EmailId email Texto usuario UserId ; clave externa especificando otras tablas EntityField tipos verkey Texto QuizásTexto de columna recién agregada "predeterminado='algún texto'::character varying" -- Nivel SQL Restricción predeterminadaUniqueEmail correo electrónico -- restricción única | ]- Esqueleto: es una capa de combinadores de Haskell para generar consultas relacionales correctas para persistir . [ 68 ]
Ejemplo de consultas rawSQL persistentes y de Esqueleto . [ 69 ]
Correo electrónico
Los siguientes paquetes forman parte de la plataforma yesod : [ 70 ]
- Funciones de conexión útiles entre la biblioteca fb y Yesod. [ 73 ]
Ciclo de desarrollo
Las nuevas aplicaciones Yesod se generan a partir de las plantillas de la herramienta HaskellStack [ 74 ] , reemplazando el comando anterior "yesod init".
Aplicación basada en pila . Los nombres de las plantillas tienen el prefijo yesod como "yesod-{minimal | postgres | sqlite | mysql | mongo | ...}".
- Dado que HaskellStack utiliza el repositorio stackage por defecto, los paquetes adicionales del repositorio hackage deben referenciarse en la sección extra-deps del archivo "stack.yaml" .
- Los paquetes pueden personalizarse para que se guarden en una subcarpeta local. Deben mencionarse en la sección de paquetes del archivo "stack.yaml" .
La herramienta "Yesod helper"
- La herramienta auxiliar yesod [ 75 ]
yesod develSe ejecuta desde el sitio del proyecto, recompila y reinicia el proyecto cada vez que se modifica el árbol de archivos.yesod add-handlerAgrega un nuevo controlador y módulo al proyecto, añadiendo una cláusula de importación para el controlador en el módulo "Aplicación".
Implementación con Keter: un servidor de monitorización de aplicaciones web y servidor proxy inverso.
Véanse las referencias [ 76 ] [ 77 ] [ 78 ]
Keter es un proceso como servicio que gestiona el despliegue y el reinicio de los servidores de aplicaciones web Yesod y, para cada aplicación web , la creación de bases de datos para PostgreSQL .
El comando de consola yesod keterempaqueta la aplicación web como un paquete keter para subirlo a una carpeta keter llamada "incoming".
Keter supervisa la carpeta "incoming" y descomprime la aplicación en una carpeta temporal, luego asigna a la aplicación web un puerto para escuchar y la inicia.
Inicialmente funcionaba con Nginx como proxy inverso (keter versión 0.1*), agregando entradas de servidor virtual a su configuración y haciendo que Nginx lo recargara, pero ahora Keter proporciona su propia funcionalidad de proxy inverso , eliminando la dependencia de Nginx y actuando como el servidor web principal. [ 79 ]
Integración con JavaScript generado a partir de lenguajes funcionales
Véase también
Referencias
- ↑ "yesodweb/yesod" .
- 1 2 3 "HaskellWiki - QuasiQuotation" . Haskell.org. 26 de mayo de 2012. Consultado el 23 de octubre de 2012 .
- ↑ "El paquete wai" . Hackage.haskell.org . Consultado el 23 de octubre de 2012 .
- ↑ "El paquete wai-extra con controlador CGI WAI" . Hackage.haskell.org . Consultado el 23 de octubre de 2012 .
- ↑ "El paquete wai-handler-fastcgi" . Hackage.haskell.org . Consultado el 23 de octubre de 2012 .
- ↑ "El paquete wai-handler-scgi" . Hackage.haskell.org . Consultado el 23 de octubre de 2012 .
- ↑ "El paquete warp" . Hackage.haskell.org . Consultado el 23 de octubre de 2012 .
- ↑ "El paquete wai-handler-launch" . Hackage.haskell.org . Consultado el 23 de octubre de 2012 .
- 1 2 "libro - Conceptos básicos" . Yesodweb.com . Consultado el 23 de octubre de 2012 .
- 1 2 "libro - Enrutamiento y manejadores" . Yesodweb.com . Consultado el 23 de octubre de 2012 .
- ↑ "Jugando con rutas y enlaces" . FPComplete.com. 17 de octubre de 2012. Archivado del original el 30 de noviembre de 2012. Consultado el 28 de octubre de 2012 .
- ↑ "libro - Autenticación y autorización" . Yesodweb.com . Consultado el 23 de octubre de 2012 .
- ↑ "El paquete yesod-auth" . Hackage.haskell.org . Consultado el 26 de octubre de 2012 .
- ↑ "Libro - Sesiones - Ver sección "Destino final"" . Yesodweb.com . Consultado el 17 de noviembre de 2012 .
- ↑ "Sesiones" . Yesodweb.com . Consultado el 23 de octubre de 2012 .
- ↑ "Web.ClientSession" . Hackage.haskell.org . Consultado el 25 de octubre de 2012 .
- ↑ "ServerSession: sesiones seguras modulares del lado del servidor" . Hackage.haskell.org . Consultado el 29 de octubre de 2018 .
- ↑ "Web.ServerSession.Frontend.Yesod" . Hackage.haskell.org . Consultado el 29 de octubre de 2018 .
- ↑ "Mensajes de sesión" . Yesodweb.com . Consultado el 23 de octubre de 2018 .
- ↑ "Creación de un subsitio" . Yesodweb.com . Consultado el 25 de octubre de 2012 .
- ↑ "Yesod y subsitios: algo obvio" . Monoid.se. 22 de agosto de 2012. Archivado del original el 11 de diciembre de 2024. Consultado el 28 de octubre de 2012 .[]
- ↑ "La magia de Yesod, parte 2 - Ver sección "Subsitio estático"" . Yesodweb.com. 25-12-2010 . Consultado el 25-10-2012 .
- ↑ "El paquete yesod-static - Subsitio estático" . Hackage.haskell.org . Consultado el 25 de octubre de 2012 .
- ↑ "El paquete yesod-auth - Subsitio de autenticación" . Hackage.haskell.org . Consultado el 25 de octubre de 2012 .
- 1 2 "libro - Formularios" . Yesodweb.com . Consultado el 23 de octubre de 2012 .
- ↑ "Yesod.Form.Fields" . Hackage.haskell.org . Consultado el 23 de octubre de 2012 .
- ↑ "Yesod.Form.Functions runFormPost" . Hackage.haskell.org . Consultado el 25 de octubre de 2012 .
- ↑ "Yesod.Form.Types" . Hackage.haskell.org . Consultado el 23 de octubre de 2012 .
- ↑ "HaskellWiki - Functor aplicativo" . haskell.org . Consultado el 24 de octubre de 2012 .
- 1 2 "La clase HasReps" . Hackage.haskell.org. Archivado del original el 1 de febrero de 2013. Recuperado el 23 de octubre de 2012 .
- ↑ "Contenido RESTful" . Yesodweb.com . Consultado el 23 de octubre de 2012 .
- ↑ "La clase ToContent" . Hackage.haskell.org . Consultado el 23 de octubre de 2012 .
- ↑ "Más Yesod del lado del cliente: ejemplo de tareas pendientes" . Yesodweb.com. 23 de abril de 2012. Consultado el 23 de octubre de 2012 .
- ↑ "Servicio web JSON" . Yesodweb.com . Consultado el 23 de octubre de 2012 .
- ↑ "El paquete yesod-json" . Hackage.haskell.org . Consultado el 23 de octubre de 2012 .
- ↑ "libro - Widgets" . Yesodweb.com . Consultado el 23 de octubre de 2012 .
- ↑ "La mónada de widgets" . Hackage.haskell.org. Archivado del original el 1 de febrero de 2013. Consultado el 23 de octubre de 2012 .
- ↑ "La mónada del escritor" . Haskell.org . Consultado el 23 de octubre de 2012 .
- ↑ "Plantilla Haskell Quasi-quotation" . Haskell.org . Consultado el 2 de noviembre de 2012 .
{{cite web}}: CS1 maint: servicio de archivado obsoleto ( enlace ) - 1 2 "libro - plantillas shakespearianas" . Yesodweb.com . Consultado el 23 de octubre de 2012 .
- ↑ "El módulo de plantilla hamlet" . Hackage.haskell.org . Consultado el 23 de octubre de 2012 .
- ↑ "Clase Text.Blaze.ToMarkup" . Hackage.haskell.org . Consultado el 23 de octubre de 2012 .
- ↑ "Class Text.Cassius.ToCss" . Hackage.haskell.org . Consultado el 23 de octubre de 2012 .
- ↑ "Clase Text.Julius.ToJavascript" . Hackage.haskell.org . Consultado el 23 de octubre de 2012 .
- ↑ "Class Text.Shakespeare.I18N.ToMessage" . Hackage.haskell.org . Consultado el 24 de octubre de 2012 .
- ↑ "Clase Text.Shakespeare.Text.ToText" . Hackage.haskell.org . Consultado el 24 de octubre de 2012 .
- ↑ "Plantilla Haskell" . haskell.org . Consultado el 3 de noviembre de 2012 .
{{cite web}}: CS1 maint: servicio de archivado obsoleto ( enlace ) - ↑ "libro - plantillas shakespearianas # Llamando a Shakespeare" . Yesodweb.com . Consultado el 23 de octubre de 2012 .
- 1 2 "El módulo de plantilla Julius" . Hackage.haskell.org . Consultado el 23 de octubre de 2012 .
- ↑ "Idioma de Roy" . Roy.brianmckenna.org. Archivado del original el 17 de octubre de 2012. Consultado el 23 de octubre de 2012 .
- ↑ "El módulo de plantilla Cassius" . Hackage.haskell.org . Consultado el 23 de octubre de 2012 .
- ↑ "El módulo de plantilla Lucius" . Hackage.haskell.org . Consultado el 23 de octubre de 2012 .
- ↑ "El módulo de plantillas de Typescript" . Hackage.haskell.org . Consultado el 10 de octubre de 2018 .
- ↑ "Módulo de plantillas de texto plano de Shakespeare" . Hackage.haskell.org . Consultado el 24 de octubre de 2012 .
- ↑ "libro - Internacionalización" . Yesodweb.com . Consultado el 23 de octubre de 2012 .
- ↑ mkMessage
- ↑ "El paquete yesod-sitemap" . Hackage.haskell.org . Consultado el 26 de octubre de 2012 .
- ↑ "El paquete yesod-newsfeed para vistas RSS/Atom" . Hackage.haskell.org . Consultado el 26 de octubre de 2012 .
- ↑ "Libro - Inicialización de datos en el tipo de datos base" . Yesodweb.com . Consultado el 26 de mayo de 2014 .
- 1 2 3 "libro - Persistente" . Yesodweb.com . Consultado el 23 de octubre de 2012 .
- ↑ "Paquete persistente Yesod" . Hackage.haskell.org . Consultado el 23 de octubre de 2012 .
- ↑ "Documentación persistente de Yesod" . github.com . Consultado el 16 de octubre de 2018 .
- ↑ "Yesod-persistent entity syntax" . github.com . Consultado el 16 de octubre de 2018 .
- ↑ "Migraciones redundantes para los valores predeterminados de los campos" . GitHub.com . Consultado el 4 de diciembre de 2012 .
- ↑ "Aplicación de cardinalidad "como máximo uno" en persistente con tipo Checkmark" . Hackage.haskell.org . Recuperado el 16 de octubre de 2018 .
- ↑ "¿Cómo puedo crear una restricción de clave externa usando Yesod/Persistent?" . stackoverflow.com . Consultado el 16 de octubre de 2018 .
- ↑ "paquete esqueleto" . Hackage.haskell.org . Consultado el 23 de octubre de 2012 .
- ↑ "Ejemplo de consulta en" . Stackoverflow.com. 19 de septiembre de 2012. Consultado el 23 de octubre de 2012 .
- ↑ "El paquete yesod" . Hackage.haskell.org . Consultado el 26 de junio de 2019 .
- ↑ "El paquete email-validate" . Hackage.haskell.org . Consultado el 26 de octubre de 2012 .
- ↑ "El paquete mime-mail" . Hackage.haskell.org . Consultado el 26 de octubre de 2012 .
- ↑ "El paquete yesod-fb" . Hackage.haskell.org . Consultado el 26 de octubre de 2012 .
- ↑ Haskell Stack - Cómo instalar
- ↑ El paquete yesod-bin con la herramienta auxiliar (con instrucciones para su uso con la herramienta stack )
- ↑ "libro - Implementación de su aplicación web" . Yesodweb.com . Consultado el 23 de octubre de 2012 .
- ↑ Readme.Md. "Yesod keter readme" . GitHub . Consultado el 23 de octubre de 2012 .
- ↑ "El paquete keter" . Hackage.haskell.org . Consultado el 23 de octubre de 2012 .
- ↑ "Actualizaciones de Keter" . Yesodweb.com. 25/10/2012 . Consultado el 25/10/2012 .
- ↑ "Keter: Implementación de aplicaciones web" . Yesodweb.com. 11 de mayo de 2012. Consultado el 23 de octubre de 2012 .
- ↑ "Keter: ¡Está vivo!" . Yesodweb.com. 17 de mayo de 2012. Consultado el 23 de octubre de 2012 .
- ↑ "Opciones de Javascript" . github.com . Consultado el 12 de marzo de 2014 .
- ↑ "Yesod, AngularJS y Fay" . yesodweb.com. 30 de octubre de 2012. Consultado el 12 de marzo de 2014 .
- ↑ "HaskellWiki - El problema de JavaScript" . haskell.org . Consultado el 12 de abril de 2014 .
Enlaces externos
- Sitio web oficial

- Presentaciones: InfoQ , Haskell eXchange 2012
- Diapositivas: ACM en la Universidad Johns Hopkins - Sitios web RESTful con Yesod. Archivado el 5 de mayo de 2013 en Wayback Machine.
- Screencast: Yesod 1.0 en Vimeo
- Libro electrónico de O'Reilly: Desarrollo de aplicaciones web con Haskell y Yesod: Desarrollo web orientado a la seguridad.
- Preguntas y respuestas: StackOverflow.com - Yesod etiquetó Preguntas y respuestas
Tutoriales de blog
- FPComplete.com - Mi primer sitio web (archivado el 12/10/2012 en Wayback Machine) , Jugando con rutas y enlaces (archivado el 30/11/2012 en Wayback Machine)
- Sí, para principiantes
- hamberg.no - handlerToIO: usar forkIO en manejadores de Yesod
Comparaciones
- HaskellWiki - Marcos de trabajo web para Haskell
- Una comparación, esperemos, justa y útil de los frameworks web de Haskell.
Otros idiomas
- Biblioteca Haskell. - Yesod Archivado el 31/07/2013 en la Wayback Machine (en español) Universidad de Cádiz
En las distribuciones de Linux
- Yesod en Debian
- Yesod en Ubuntu
- marcos de trabajo web
- Software libre programado en Haskell
- Software de 2010
- Software que utiliza la licencia MIT.