标签: yesod

Yesod中的Websockets?

我想使用Yesod和websockets(html5)创建一个网站.

我可以使用带有Yesod webframework的websockets吗?

haskell websocket yesod

10
推荐指数
1
解决办法
1603
查看次数

Yesod:在AJAX调用中使用类型安全URL

在我的Yesod项目中,我有以下路线:

/api/hide/thread/#Text/#Int      ApiHideThreadR   GET
Run Code Online (Sandbox Code Playgroud)

我想用javascript在客户端请求它:

function hideThreadCompletely(threadId, board) {
    $.getJSON("/api/hide/thread/"+board+"/"+threadId, function(data) {
        $('#thread-'+threadId).hide();
    });
}
Run Code Online (Sandbox Code Playgroud)

但我无法使用,@{ApiHideTHreadR}因为Yesod需要它在编译时的参数.什么是这种情况的妥善解决,如果我想API网址的样子api/board/1/1,而不是api/board?bid=1&tid=1?继续使用手动定义的URL "/api/hide/thread/"+board+"/"+threadId吗?

javascript ajax haskell yesod

10
推荐指数
1
解决办法
430
查看次数

在Yesod中显示动态生成的图像

我正在写我的第一个Yesod应用程序.该应用程序涉及用户选择查看图表,该图表是基于存储在服务器上的DB中的数据动态生成的.我知道如何获取用户请求并在服务器的文件系统上创建映像,但是如何创建一个呈现它的响应页面?

PS由于我正在使用GnuPlot生成图像,我只知道如何将其作为文件写入文件系统,但如果您碰巧知道如何将数据存入内存,那么它可能会更好.谢谢,

haskell yesod

9
推荐指数
1
解决办法
1019
查看次数

Yesod删除级联

根据http://www.yesodweb.com/blog/2010/07/database-migrations,DeleteCascade几年前添加了一个类型类.我只能假设这是为了添加到模型中.设置我的模型配置后像这样:

Field
    ...
    foreignId ForeignId DeleteCascade
Run Code Online (Sandbox Code Playgroud)

我的申请编译得很好.但是数据库模式没有改变,删除也不是由应用程序级联的.我应该(颤抖)手动做吗?有没有更好的办法?

我正在使用Yesod脚手架(Application.hs,Foundation.hs,Settings.hs,...)

haskell yesod

9
推荐指数
1
解决办法
861
查看次数

在Haskell和Yesod中返回错误状态

我是Haskell的新手.

我正在尝试使用Yesod Framework编写一个小型Webdav服务器,并在Apache Tomcat 7源代码之后进行建模.我遇到了一个从我的一个函数返回错误的问题.WebdavServlet

我的webdav服务应该返回XML或JSON,具体取决于Accept调用者发送的标头的值.我定义了一个名为的数据类型RepXmlJson:

import Yesod

data RepXmlJson = RepXmlJson RepXml RepJson

instance HasReps RepXmlJson where
  chooseRep (RepXmlJson (RepXml xml) (RepJson json)) = chooseRep
    [ (typeXml, xml)
    , (typeJson, json)
    ]
Run Code Online (Sandbox Code Playgroud)

我使用此数据类型作为我的服务的返回值,特别是lockWebdavR函数.如果资源当前被锁定,我试图返回状态423(已锁定).我的代码看起来像这样:

import qualified Data.ByteString as B
import qualified Data.Map        as M
import qualified Data.Text       as T
import qualified Network.Wai     as W

mkYesodSub "Webdav" [] [parseRoutes|
  / WebdavR COPY DELETE LOCK MKCOL MOVE OPTIONS PROPFIND PROPPATCH PUT …
Run Code Online (Sandbox Code Playgroud)

haskell http-status-codes yesod

9
推荐指数
1
解决办法
717
查看次数

尝试一些Yesod示例时编译错误

我正在尝试Yesod在Yesod网页上记录的书籍示例.其中一个示例是Wiki中嵌入的聊天应用程序.当我在ghci(加载Chat模块,Wiki.hs其中包含Wiki示例代码)中尝试它时,我得到以下关于Chat.hs的错误:

Chat.hs:122:34:
    Could not deduce (Text.Julius.ToJavascript Text)
      arising from a use of `Text.Julius.toJavascript'
    from the context (YesodChat master)
      bound by the type signature for
                 chatWidget :: YesodChat master =>
                               (Route Chat -> Route master) -> GWidget sub master ()
      at Chat.hs:(81,15)-(83,35)
    Possible fix:
      add an instance declaration for (Text.Julius.ToJavascript Text)
    In the first argument of `Text.Julius.Javascript', namely
      `Text.Julius.toJavascript output'
    In the expression:
      Text.Julius.Javascript (Text.Julius.toJavascript output)
    In the first argument of `Data.Monoid.mconcat', namely …
Run Code Online (Sandbox Code Playgroud)

haskell yesod

9
推荐指数
2
解决办法
863
查看次数

在Esqueleto和Yesod中执行COUNT(id)的正确方法是什么

我试图弄清楚如何使用Esqueleto编写以下查询

SELECT COUNT("person"."id")
FROM "person"
WHERE (("person"."admin" = 't' OR "person"."vip" = 't') // 't' as in True
      OR "person"."karma" >= 5000 AND "person"."hellbanned" = 'f')
Run Code Online (Sandbox Code Playgroud)

这是我的模型的定义方式

Person
    admin Bool
    vip Bool
    karma Int
    hellbanned Bool
Run Code Online (Sandbox Code Playgroud)

除了COUNT部分之外,我已经成功获得了所有东西

select $
  from $ \p -> do
    where_
      ((p ^. PersonAdmin ==. val True) ||. (p ^. PersonVip ==. val True)
      &&. (p ^. PersonKarma >=. val 5000) &&. (p ^. PersonHellbanned ==. val False))
    return $ p ^. PersonId
Run Code Online (Sandbox Code Playgroud)

我设法找到了一个 …

haskell persistent yesod esqueleto

9
推荐指数
1
解决办法
577
查看次数

使用Yesod的Persistent存储现有数据类型

我能找到的关于Persistent的所有教程和参考都非常详细地描述了Persistent如何在DSL中的单个定义中自动创建新的数据类型,模式,迁移等.但是,我找不到有关如何使Persistent处理现有数据类型的解释.

一个例子:假设我有一个已经存在的Haskell模块用于某些游戏逻辑.它包括玩家的记录类型.(它意味着通过镜头使用,因此是下划线.)

data Player = Player { _name   :: String
                     , _points :: Int
                     -- more fields ...
                     }
$(makeLenses ''Player)
Run Code Online (Sandbox Code Playgroud)

问题:使用Persistent将这种类型存储在数据库中的规范方法是什么?我可以实现一些类型类吗?或者我应该通过Persistent最好地定义一个新类型,例如

share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase|
PlayerEntry
    name Text
    points Int
|]
Run Code Online (Sandbox Code Playgroud)

然后在这些类型之间手动映射?

playerToEntry :: Player -> PlayerEntry
playerToEntry pl = PlayerEntry (pl^.name) (pl^.points)

entryToPlayer :: PlayerEntry -> Player
entryToPlayer e = Player (name e) (points e)
Run Code Online (Sandbox Code Playgroud)

haskell persistent yesod

9
推荐指数
1
解决办法
705
查看次数

编译时与Hamlet模板的运行时成本

对于Hamlet模板机制,我理解模板在编译时被解析,导致源代码包含对blaze-html组合器的调用(以及可能因插值而导致的其他表达式).因此,插值发生的点(子树)在编译时是已知的.

在运行时,我们需要计算内插值(当然),并在树中"插入",即应用html组合器.他们都是?实际上,这些应用程序中的一些可以在编译时进行评估(那些在它们下面没有插值的应用程序).这会发生吗?

haskell yesod hamlet

9
推荐指数
2
解决办法
168
查看次数

在类型级别编码身份验证的存在/不存在

上下文:从将运行时错误转换为编译时错误的角度来看,我正在接近Haskell.我的假设是,如果可以在程序类型本身内编写业务逻辑,那么这是可能的.

我正在写一个Telegram bot,我公司的用户应该可以访问它.为了实现这种"限制",每当有人开始与机器人聊天时,它将chat_id在表格中查找并检查是否oauth_token存在有效.如果没有,系统会首先向用户发送完成Google OAuth的链接(我们公司的电子邮件托管在Google Apps for Business上).

share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase|
VLUser
  email String
  chatId Integer
  tgramUserId Integer
  tgramFirstName String
  tgramLastName String Maybe
  tgramUsername String Maybe
  oauthToken String Maybe
  deriving Show
|]
Run Code Online (Sandbox Code Playgroud)

具有有效权限的用户oauth_token将能够为Telegram bot提供一些命令,未经身份验证的用户无法提供这些命令.

现在,我试图在类型级别本身编写这个逻辑.我的Haskell代码中将有一些函数能够接受经过身份验证和未经身份验证的用户作为参数; 而某些功能应该只接受经过身份验证的用户.

如果我继续传递相同类型的用户对象,即VLUser无处不在,那么我将不得不小心检查oauthToken每个函数的存在.有没有办法创建两种用户类型 - VLUser以及VLUserAuthenticated:

  1. 两者都映射到相同的基础表
  2. VLUserAuthenticated只有在有A的情况下才能实例化oauthToken

haskell yesod

9
推荐指数
1
解决办法
156
查看次数