标签: yesod

比较Haskell的Snap和Yesod Web框架

最近新闻中的两个Haskell网络框架是Yesod(0.8)和Snap(0.4).

很明显,Yesod目前支持的功能远远多于Snap.但是,我无法忍受Yesod用于其HTML,CSS和Javascript的语法.

所以,如果我选择使用Snap,我想了解我会失踪的内容.例如,看起来不像数据库支持那样.会议怎么样?其他特性?

haskell web-frameworks yesod haskell-snap-framework

231
推荐指数
4
解决办法
3万
查看次数

Yesod中的例外情况

我做了一个守护进程,它使用了一种非常原始的形式ipc(telnet并发送一个按特定顺序排列某些单词的String).我抢购了它,现在JSON用来将消息传递给Yesod服务器.但是,有一些我真的很喜欢我的设计,我不确定我现在的选择.

这就是我在做的事情:

buildManager :: Phase -> IO ()
buildManager phase = do
  let buildSeq = findSeq phase
      jid = JobID $ pack "8"
      config = MkConfig $ Just jid
  flip C.catch exceptionHandler $ 
  runReaderT (sequence_ $ buildSeq <*> stages) config
  -- ^^ I would really like to keep the above line of code, or something like it.
  return ()
Run Code Online (Sandbox Code Playgroud)

buildSeq中的每个函数都是这样的

foo :: Stage -> ReaderT Config IO ()

data Config = MkConfig (Either JobID …
Run Code Online (Sandbox Code Playgroud)

json haskell exception-handling yesod

94
推荐指数
1
解决办法
3247
查看次数

如何让esqueleto为我生成一个SQL字符串?

如何从from语句中生成esqueleto以生成SQL字符串?

文档toRawSql说"你可能只是打开持久性的查询记录".我尝试了所有可能的形式MonadLogger,但我从未打印过任何SQL.同样的文档也说"手动使用这个功能......可能但很乏味".但是,不会QueryType导出该类型的构造函数,也不会导出返回该类型值的任何函数.我设法通过注意这QueryType是一个newtype和使用来解决这个问题unsafeCoerce!

我也被迫提供Connection(我通过SQLite获得),即使不需要连接到数据库来生成SQL.

这就是我所拥有的.肯定有更好的办法.

withSqliteConn ":memory:" $
    \conn -> return $ toRawSql SELECT
                               (unsafeCoerce ((const mempty)
                                  :: a -> Text.Lazy.Builder.Builder))
                               (conn, initialIdentState) myFromStatement)
Run Code Online (Sandbox Code Playgroud)

http://hackage.haskell.org/package/esqueleto-1.3.4.2/docs/Database-Esqueleto-Internal-Sql.html

haskell yesod esqueleto

86
推荐指数
1
解决办法
2580
查看次数

Yesod中的多个Auth?

我需要在我的应用程序中要求多种身份验证类型; 特别是:应用程序的某些部分需要对dropbox进行身份验证,而某些部分则需要基于电子邮件的身份验证,例如browserID.

我怎么处理这个?

我可以将身份验证附加到子网站吗?由于YesodAuth类在所有示例中都将master foundation数据类型作为参数,因此我不知道如何做到这一点.

如果没有,还有其他方法吗?

authentication haskell yesod

48
推荐指数
1
解决办法
744
查看次数

Yesod:从Int获取ID的数据库实体

我是Haskell和Yesod的新手,我正在尝试构建一个可以从外部API回答查询的简单Web应用程序.我已经构建了一个解析器(使用Parsec),它获取了我想要作为常规Int值加载的实体的ID.

但是,我对于我的生活无法弄清楚如何将这个Int变成get可接受的东西(即a Key(?)).文档中的所有示例仅从先前插入或从url dispatch获取id.

任何帮助将不胜感激,因为我似乎被困... :)

persistence haskell yesod

36
推荐指数
2
解决办法
3410
查看次数

有关并发访问持久数据库的规则是什么

似乎关于并发访问的规则是未记录的(在Haskell方面)并且简单地假设开发人员熟悉正在使用的特定后端.对于生产需求而言,这是一个完全合理的假设,但对于随意的原型设计和开发,如果持久性*包更加自包含,那将会很好.

那么,管理对persistent-sqlite和family的并发访问的规则是什么?隐含地,如果我们有连接池,则必须允许某种程度的并发,但是通常创建单个连接池并且调用replicateM x $ forkIO (useThePool connectionPool)会产生以下错误.

user error (SQLite3 returned ErrorBusy while attempting to perform step.)
Run Code Online (Sandbox Code Playgroud)

编辑:现在下面是一些示例代码.

在下面的代码中,我分叉了6个线程(任意数字 - 我的实际应用程序执行3个线程).每个线程不断存储和查找记录(来自其他线程正在访问的记录的唯一记录,但这无关紧要),打印其中一个字段.

{-# LANGUAGE TemplateHaskell, QuasiQuotes
           , TypeFamilies, FlexibleContexts, GADTs
           , OverloadedStrings #-}
import Control.Concurrent (forkIO, threadDelay)
import Database.Persist
import Database.Persist.Sqlite hiding (get)
import Database.Persist.TH
import Control.Monad
import Control.Monad.IO.Class

share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persist|
SomeData
    myId Int
    myData Double
    MyId myId
|]

main = withSqlitePool "TEST" 40 $ \pool -> do
  runSqlPool (runMigration migrateAll) pool
  mapM_ forkIO [runSqlPool …
Run Code Online (Sandbox Code Playgroud)

haskell persistent yesod

32
推荐指数
1
解决办法
1883
查看次数

将Yesod部署到Heroku,无法静态构建

我是Yesod的新手,我无法静态构建Yesod,因此我可以部署到Heroku.

我更改了默认的.cabal文件以反映静态编译

if flag(production)
   cpp-options:   -DPRODUCTION
   ghc-options:   -Wall -threaded -O2 -static -optl-static
else
   ghc-options:   -Wall -threaded -O0
Run Code Online (Sandbox Code Playgroud)

它不再构建.我得到了一大堆警告,然后是一大堆未定义的引用,如下所示:

Linking dist/build/personal-website/personal-website ...
/usr/lib/ghc-7.0.3/libHSrts_thr.a(Linker.thr_o): In function
`internal_dlopen':
Linker.c:(.text+0x407): warning: Using 'dlopen' in statically linked
applications requires at runtime the shared libraries from the glibc
version used for linking
/usr/lib/ghc-7.0.3/unix-2.4.2.0/libHSunix-2.4.2.0.a(HsUnix.o): In
function `__hsunix_getpwent':
HsUnix.c:(.text+0xa1): warning: Using 'getpwent' in statically linked
applications requires at runtime the shared libraries from the glibc
version used for linking
/usr/lib/ghc-7.0.3/unix-2.4.2.0/libHSunix-2.4.2.0.a(HsUnix.o): In
function `__hsunix_getpwnam_r':
HsUnix.c:(.text+0xb1): warning: Using 'getpwnam_r' in …
Run Code Online (Sandbox Code Playgroud)

linux haskell heroku static-linking yesod

27
推荐指数
2
解决办法
3万
查看次数

如何将惰性文本转换为非惰性文本?

我是Haskell的新手,所以这可能是一个微不足道的问题.我看到一条错误消息说

Couldn't match expected type 'Data.Text.Lazy.Internal.Text'
with actual type 'Data.Text.Internal.Text'
Run Code Online (Sandbox Code Playgroud)

我认为问题是实际的类型是Data.Text.Text,它期望懒惰的文本.如何将一个转换为另一个?

编辑:

这是一个提供此错误的简化代码.

{-# LANGUAGE OverloadedStrings #-}
import Data.Text.Lazy.Encoding import Network.Mail.Mime import Yesod
data FormData = FormData { dataField :: Textarea } deriving Show
part d = Part { partType = "text/plain; charset=utf-8" , partEncoding = None , partFilename = Nothing , partContent = encodeUtf8 $ unTextarea $ dataField d , partHeaders = [] }
main = return ()
Run Code Online (Sandbox Code Playgroud) 基本上我有一个带有textarea输入元素的yesod表单,我想通过电子邮件发送textarea的内容.

haskell yesod

25
推荐指数
1
解决办法
3984
查看次数

为什么Yesod会话cookie不能被劫持?

耶索德书

加密防止用户检查数据,签名确保会话既不会被劫持也不会被篡改.

我不清楚为什么会这样.如果窃听者在从服务器发送cookie并在合法用户发出另一个请求之前使用它时获取cookie,那么会话最终是否会被劫持?

在我看来,真正防止会话劫持的唯一方法是始终使用SSL.但是如果我这样做那么Yesod的签名和加密最终会成为不必要的开销(EDIT:防止劫持的开销.正如@sr_在评论中指出的那样,它仍然有用).

security yesod

21
推荐指数
1
解决办法
2140
查看次数

如何在websockets中使用Yesod的身份验证?

我想在Yesod应用程序中使用websockets.如果我对websockets包的理解是正确的,这意味着我需要定义一个ServerApp,它是PendingConnection -> IO ()如何处理连接请求的函数,然后使用我的Warp设置的settingsIntercept字段将其插入我的应用程序.如何根据Yesod的身份验证进行处理?例如,如果我想拒绝除以授权用户身份登录的客户端之外的连接,我该如何检测当前登录的用户?因为我们不是在Handler monad中工作,所以似乎我们没有办法调用像maybeAuthId.是手动查看连接请求标头的唯一选择吗?

haskell websocket yesod

19
推荐指数
1
解决办法
361
查看次数