服务器端会话不是Snap Framework的一部分.有没有办法添加某种服务器端状态?
让我假装我想为每个HTTP请求增加一个计数器.我该怎么办?
清理Snap项目源目录(删除dist)会产生以下抱怨:
A web handler threw an exception. Details:
GHC error: can't find a package database at dist/package.conf.inplace
Run Code Online (Sandbox Code Playgroud)
所以,如果我清理源目录它停止工作?如果我用开发标志编译,这只会发生吗?
这让我想到了snap应用程序部署的问题.我们实际上是什么rsync到服务器以及什么是运行时依赖项?我当然不想在部署服务器上安装整个haskell平台.我在服务器上需要的只是项目可执行文件和静态文件,如*.tpl,*.css等.这是正确的吗?
我可以看到两种部署应用程序的方法:rsync可执行文件及其依赖项,或创建二进制分发tarball并将其转移到服务器.常见的做法是什么?
我需要在二进制tarball或rsync脚本中包含哪些文件才能满足所有运行时依赖性?
谢谢
我一直在谷歌上搜索一下如何使用Snap会话的例子.到目前为止还没有.有人可以指点我一篇文章或一些基于cookie会话的简单例子吗?
代码片段非常贴切.类似于在会话中放置用户名并在每个请求之前检查其存在性和有效性.我看了一下Snap.extension.session,但我仍然太习惯于从库代码中找出如何使用它.
我知道setInSession是将会话值放在cookie中的函数,但是我无法弄清楚如何从签名中使用它:
setInSession k v = Map.insert k v `liftM` getSession >>= setSession
Run Code Online (Sandbox Code Playgroud)
或者如何将整个事物粘在一起.
我不知道是否违反规则要求一些示例代码,但如果我能在网上找到任何东西,我就不会这样做.
先感谢您.
---更新---
我按照下面的例子和链接,但事情仍然没有正确.
我只想要一个简单的测试,读取一个键和一个值,并将其放入会话cookie,然后我想读回会话值并显示.
所以我初始化了我的会话并将其置于主应用程序状态.
s <- nestSnaplet "" sess $ initCookieSessionManager "config/site_key.txt" "sess" (Just 3600)
Run Code Online (Sandbox Code Playgroud)
第一个困惑是会话初始化扇区需要的关键.在初始项目设置期间不会创建密钥.
那么我该如何创建呢?应该在项目文件结构中的键位于何处,以便函数可以找到它?
然后是处理程序:
putCookie :: Handler App App ()
putCookie = do
par <- getPostParams
let k = T.decodeUtf8 $ head (par ! (B.pack "key"))
let v = T.decodeUtf8 $ head (par ! (B.pack "value"))
with sess $ setInSession k v
heistLocal (bindString "message" "Cookie inserted!") $ render …Run Code Online (Sandbox Code Playgroud) 我正在尝试理解编译的拼接以及如何将它们与消化函子形式一起使用.有人有任何代码示例吗?
我似乎无法掌握编译的抢劫概念.网上没有任何例子.我将如何将简单的代码片段从解释更改为已编译.
例如:
listUsersH :: AppHandler ()
listUsersH = do
users <- liftIO $ getColList "users"
let userListS = mapSplices userLinkS users
heistLocal (bindSplice "users" userListS) $ render "list-users"
where
userLinkS d = runChildrenWithText [("user",T.pack $ at "uname" d)]
Run Code Online (Sandbox Code Playgroud)
如何使用编译的抢劫执行"runChildren","mapSplices","bindSplice"和"render"的简单组合?
我理解这个概念是不同的,没有"heistLocal"..但我现在需要回过头来重新学习如何做一些基本的事情,比如以"for each"循环方式显示一堆记录.有人可以澄清这一点,并显示一个简单的例子,如上面的那个,但编译抢劫?
目前我甚至不知道如何使用编译的抢劫进行简单的变量替换.例如,这个:
simpleString = "Insert me..."
insertString = heistLocal (bindSplices spl) $ render "tst"
where
spl = [("var", textSplice simpleString)]
Run Code Online (Sandbox Code Playgroud)
请有人帮助我完成基本操作,或者将我指向一个带有一些最小例子的位置.我确实阅读了快照网站文档.
我在Yesod的主页上看过基准测试,但它们主要用于静态文件.Snap网站上的基准测试已经过时了.
我正在尝试将Haskell模块公开为服务.服务器的逻辑是在json中接收函数名和参数,调用haskell函数并再次将输出作为json传递.引用透明性保证了线程安全性以及记忆和缓存功能的能力.
如果我支持大约2k - 5k的并发连接,我将如何实现它?这种方法的可扩展性如何?
有人可以展示如何在阅读器monad中使用snap monad吗?Monad变形金刚迷惑我.(或者,我很乐意接受有关monad变换器的教程的建议,以及查看光线的方法,并最终了解它们.)
编辑:糟糕; 忘了说明我实际上要做的事情,而不是寻求特定事情的帮助.战略,而不是战术.我特别希望在所有处理程序之间共享数据库连接/池,而不必在指定路由时显式传递该数据库连接/池.似乎读者monad将是实现这一目标的方法.
我喜欢快照框架,但我讨厌每次迭代运行'cabal install'(小代码更改)我想试试.
有快速迭代的替代方案吗?
我想我前段时间确实问了一个类似的问题,但由于API不稳定而没有回答.所以我在等待0.13经过.我不确定提出类似问题是否正确......?
什么是替代解释runChildrenWith(Text),并mapSplices在编译的接头世界吗?(这种组合似乎是最常见的)如果可能,我真的很感谢一些代码示例.
如果我理解正确,我们将所有应用程序拼接汇集在一起,然后将它们添加到heistInit.有人能说明怎么做吗?
splice绑定标记在整个应用程序中必须是唯一的吗?
是否有完整的快照项目utilising新API和编译的拼接,以便我可以阅读和看到学习?
谢谢.
- 更新 -
下面很好的答案.但不幸的是,有些部分(带镜头的部分)让我更加困惑.如果我理解正确,这是拼接字符串的简单方法:
mySplice = "testSplice" ## testSplice
where testSplice = return $ C.yieldRuntimeText $ do
return "text to be spliced"
Run Code Online (Sandbox Code Playgroud)
如果我需要多次运行拼接字符串,比如在5个表格中,我会这样做:
mySplices = C.manyWithSplices C.runChildren mySplice
Run Code Online (Sandbox Code Playgroud)
它是否正确?
我试图在抢劫配置中添加拼接时遇到一堆错误.
addConfig h $ mempty
{
hcCompiledSplices = "mySplice" ## mySplice -- or mySplices
}
Run Code Online (Sandbox Code Playgroud)
我哪里错了?抱歉很慢.
所有我真正需要的(只是现在,所以我能理解)是拼接和显示我从数据库收到的简单字符串.
- 更新2 -
感谢极端有用的丹尼尔回答我终于可以得到一些有用的东西了.
到目前为止,我得到了两种代码变体.
第一个,感谢Daniel
stringSplice :: Monad n => C.Splice n
stringSplice = C.manyWithSplices C.runChildren splicefuncs (return ["aa","bb","cc"]) …Run Code Online (Sandbox Code Playgroud) 当尝试在 Windows 中从 cabal 安装snap时,它抱怨无法找到 C 编译器。
这是输出:
> cabal update
> cabal install snap
Resolving dependencies...
In order, the following will be installed:
directory-1.2.0.0 (new version)
clientsession-0.8.0.1 (new package)
directory-tree-0.10.1 (new version)
process-1.1.0.2 (new version)
heist-0.8.1.1 (reinstall) changes: directory-1.1.0.2 -> 1.2.0.0,
directory-tree-0.11.0 -> 0.10.1, process-1.1.0.1 -> 1.1.0.2
unix-compat-0.4.0.0 (new package)
configurator-0.2.0.1 (new package)
snap-core-0.9.2.1 (new package)
snap-server-0.9.2.3 (new package)
snap-0.9.2.1 (new package)
Warning: Note that reinstalls are always dangerous. Continuing anyway...
Configuring directory-1.2.0.0...
configure: WARNING: unrecognized options: …Run Code Online (Sandbox Code Playgroud)