问题标签 [haskell-snap-framework]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
haskell - 测试 Snap Web 框架处理程序
我想为我的 Snap Web 处理程序编写一些集成测试,但我被卡住了。这是场景。我有一个 Snap Web 处理程序,它(普通风格)CRUDs 了一个类型,它看起来像这样:
该Snap.Test
模块有一些东西可以帮助建立一个请求,我用它来向我的处理程序发出请求:
这是问题所在,我想为此处理程序制作一个 TestUnit TestCase,所以我需要在createOwnerReq
请求上运行处理程序。该模块Snap.Test
提供:
所以
可是等等!!!我的请求处理程序是 typeAppHandler ()
但runHandler
需要一个 Handler 类型Snap a
。如何将我的AppHandler
类型提升到Snap
monad?请帮忙,这有点让我失望。
haskell - 引用子 Snaplets 的首选方法
在Snap 框架中,Snaplets 用于通过基于组件的接口将功能嵌入到其他 Snaplet 中:主 Web 应用程序是一个 Snaplet,它通过经典的“has-a”关系引用其他 Snaplet,子 Snaplets 可以反过来引用其他 Snaplets。
在查看各种 Snaplet 实现时,我看到了用于将 Snaplet 嵌入到父 Snaplet 中的不同模式。具体来说:
一种参考。Snaplet 实现假定存在与父 Snaplet 的特定类型的关系。这是通过使用的参考方法强制执行的(见下文)。
一个简单的参考:
/li>相对镜头:
/li>
参考方法。Snaplet 实现通过其接口强制执行访问 Snaplet 数据的特定方式,并且不同的 Snaplet 实现使用不同的方法。Snaplet 假设:
MonadState
每次调用操作 Snaplet 的函数时,数据都会出现。- 数据存在于 a 中
MonadState
并包装在Snaplet
包装器中。 - 有一个像
instance HasSubSnaplet MySnaplet
这样的类+实例,它具有用于获取 Snaplet 数据的功能,MySnaplet
前提MySnaplet
是 aMonadState
在调用该函数时位于 a 中。 - 3.中的函数有类型
MySnaplet -> Snaplet SubSnaplet
。 - 有一个像 3. 中那样的类+实例,它提供了一个
Lens MySnaplet (Snaplet SubSnaplet)
. - 类+实例需要一个
Lens (Snaplet MySnaplet) (Snaplet SubSnaplet)
. - class+instance 假定它
MySnaplet
是应用程序的“顶级 Snaplet”,并且需要绝对镜头/参考,因此MySnaplet
必须b
在MonadSnaplet
.
如我所见,如果 Snaplet 是只读的,则引用类型 1. 有意义,如果 Snaplet 需要更改,则引用类型 2. 有意义。
MySnaplet
此外,当只能有一个而没有更多时,为该方法设置一个类是有意义的SubSnaplet
,并且具有绝对引用对于数据库之类的东西可能是有意义的,因为只有顶级 Snaplet 才能访问凭据和什么不是。但是,作为 Snaplet 编写器做出这种假设可能是错误的,使用相对引用来代替也没有任何缺点。
不过,有一个问题:现有的关于 Hackage 的 Snaplets 不符合我所做的这些假设;上述所有方法似乎都是随机使用的,适用于各种情况。此外,我认为上述其他一些方面没有优势/劣势(例如是否需要Snaplet
包装器)。
对我来说,参考类型 2. 和方法 1、2、5 或 6 中的一种似乎在所有情况下都是最有意义的,而且我认为没有理由为什么一直没有就只使用 eg (2, 1) 达成共识.
所以:
作为 Snaplet 编写者,在编写新的 Snaplet 时应该首选哪种方法(假设它具有通用目的),以及
现有的所有 Snaplets 还没有使用相同的参考方法的原因是什么(即使在核心snap
包中,也使用了大量不同的方法)?
haskell - Snap:获取表单数据和“如果”
我似乎无法理解如何通过抢劫获取表单数据。我刚开始研究 Haskell Web 框架,但文档有点……至少可以这么说。在 snap 网站上的瘦抢劫教程中没有提到表单。那么给定一个简单的 html 表单,我如何将表单数据处理到我的处理函数中?谁能指点我一个教程,谷歌只是对这个保持沉默吗?或者也许是一个简短的例子......
另外,我在哪里可以获得有关条件控制的信息?说,如果我想有条件地在我的页面中包含 html 的某些部分,我该怎么做呢?基本上,“如果”在哪里?
谢谢
haskell - 如何在没有 cabal 安装的情况下迭代 snap 框架
我喜欢 snap 框架,但我讨厌在我想尝试的每次迭代(微小的代码更改)中运行“cabal install”。
是否有快速迭代的替代方案?
haskell - Haskell Snap:在处理程序中执行 IO 操作?
比如说,我在单独的 DB.hs 文件中有一个随机 DB 函数。像这样的东西:
现在,如果我导入 DB.hs,如何在 Site.hs 中的处理程序中执行这些函数?
如果我像这样简单地将它粘贴在我的处理程序中(这只是一个示例):
这不起作用。我不希望处理程序返回任何东西,我只希望它保存 Person 而不返回/渲染任何东西。
正确的做法是什么?
谢谢。
haskell - TimeoutManager 使用 tryPutMVar 什么都不放
在 Snap 源Snap.Internal.Http.Server.TimeoutManager
为什么会有 _morePlease 字段?
做什么_ <- tryPutMVar morePlease ()
?
haskell - snaplet-environment 总是返回回退
我有一个类似的配置:
我正在启动我的应用程序
我的应用程序@生产
然而,
lookupEnvDefault "config-url" "http://www.microsoft.com"
总是返回“http://www.microsoft.com”
如果我编辑文件并取出生产条目,则会收到以下错误:
给定环境名称:在您的配置文件中找不到 @production。
所以它显然正确地解析了配置文件!
haskell - Haskell, Snap:简单的 snaplet 结构。我们什么时候使用 snaplet,什么时候使用 library?
我试图了解简单的 snaplet 构造。另外,我什么时候需要制作一个 snaplet,什么时候需要一个简单的侧库?如果我确实需要一个,我该如何从图书馆里拿出来?
例如,我有一堆 DB 函数,我在其中包装我的 SQL 代码,如下所示。
每个函数都会启动一个新连接并在提交后关闭连接。我想制作一个 snaplet 是避免在每个功能中连接的方法?在我的处理程序中,我会这样使用它:
到目前为止它有效。我的问题是/是:我什么时候真正需要将库变成 snaplet?我是否需要将我的简单数据库库变成一个 snaplet 来初始化连接而不是在每个函数中建立连接?
现在,如果我制作 snaplet ... 在 Snap 网站上有一个顶级 sanaplet 的小示例,但没有任何关于如何制作您自己的简单可插拔 snaplet 的痕迹。
所以我在我的数据库库中添加了 snaplet 初始化函数
这是正确的做法吗?这就是我需要把它变成一个可插拔的 snaplet 的全部吗?
然后我将这个 DB snaplet 堆叠到主应用程序中
现在,我获得的只是请求处理程序可用的连接,对吧?所以我的处理程序变成:
这似乎不起作用。我究竟做错了什么?这是从 snaplet 句柄 (dbcon) 中提取连接的正确方法吗?这通常是构建简单 snaplet 的正确方向吗?在我的情况下,我真的需要一个 snaplet 吗?
谢谢。
haskell - Haskell Snap:应用程序部署和运行时依赖项
清理 Snap 项目源目录(删除 dist)会产生以下抱怨:
所以如果我清理源目录它会停止工作?仅当我使用开发标志编译时才会发生这种情况吗?
这让我想到了快照应用程序部署的问题。我们实际上 rsync 到服务器的内容是什么,运行时依赖项是什么?我当然不想在部署服务器上安装整个 haskell 平台。我在服务器上需要的只是项目可执行文件和 *.tpl、*.css 等静态文件。这是否正确?
我可以看到两种部署应用程序的方法:rsync 可执行文件及其依赖项或创建二进制分发 tarball 并将其转移到服务器。常见的做法是什么?
我需要在二进制 tarball 或 rsync 脚本中包含哪些文件才能满足所有运行时依赖项?
谢谢
haskell - Haskell Snap:会话示例
我一直在谷歌搜索有关如何使用 Snap 会话的示例。到目前为止什么都没有。有人可以指点我一篇文章或带有基于 cookie 的会话的简单示例的内容吗?
一个代码片段将非常受欢迎。就像将用户名放入会话中并在每次请求之前检查其存在和有效性。我查看了 Snap.extension.session 但我仍然太菜鸟,无法仅从库代码中弄清楚如何使用它。
我知道 setInSession 是将会话值放入 cookie 的函数,但我无法从签名中完全弄清楚如何使用它:
或者如何将整个东西粘合在一起。
我不知道要求一些示例代码是否违反规则,但如果我能在网上找到任何东西,我就不会这样做。
先感谢您。
- - 更新 - -
我按照下面的示例和链接进行操作,但事情仍然不正确。
我只想要一个简单的测试,它读取一个键和一个值并将其放入会话 cookie,然后我想读回会话值并显示。
所以我初始化了我的会话并将其置于主应用程序状态。
第一个混淆是会话初始化功能需要的关键。在初始项目设置期间不会创建密钥。
那么我该如何创建呢?项目文件结构中的密钥应该放在哪里以便函数可以找到它?
然后处理程序:
这只是从 web 表单中读取键和值,它应该将键值对放在 cookie 中。好吧,显然它没有。
这个只是读回来并显示。我总是得到一个空字符串,这意味着没有这样的事情。
以上任何内容看起来都不正确吗?我在哪里犯错?一切编译正确,但会话 cookie 不存在。