我有一个爱好网络项目。很简单,只是为了学习 Haskell 和 web 编程。为清楚起见,我使用 Snap 框架。我有以下代码(site.com/auth 处理程序):
auth :: MonadSnap m => m ByteString
auth = withSession $ \s -> do
Just user <- getPostParam "user"
Just password <- getPostParam "password"
if user == "demi" && password == "1234"
then redirect "/"
else redirect "/login"
withSession
读取当前会话并运行参数中的函数。在这里我面临一个问题:用户获得授权,我想为会话添加新值s
并使用它运行代码。最好的方法是什么?你会怎么做?假设下面的代码也使用s
.
auth
另一个问题:我能否以某种方式在处理程序(如)和其他函数中透明地提供上下文?我不想使用以下参数提取所有函数中的所有上下文(如数据库连接、会话和可能其他)ctx
:
findGoodies :: MonadSnap m => MyContext -> String -> m String
checkCaptcha :: MonadSnap m => MyContext -> m Bool
breakingNews :: MonadSnap m => MyContext -> m ByteString
理想情况下,我想要一个功能withContext
,但在处理请求期间可能会更改上下文。我想我可以定义我的 monad 来解决它(对吗?),但是我已经必须使用 Snap monad 并且我不能扩展它(这也是一个问题)?
希望我说得很清楚对我有帮助。