标签: haskell-wai

Scotty:连接池作为monad阅读器

有数以万亿计的monad教程,包括读者,当你阅读它时似乎都很清楚.但是当你真正需要写作时,它就变成了另一回事.

我从未使用过读者,只是在实践中从未使用过.所以尽管我读到了它,但我不知道如何去做.

我需要在Scotty中实现一个简单的数据库连接池,以便每个操作都可以使用该池.该池必须是"全局的",并且可由所有操作功能访问.我读到了这样做的方法是Reader monad.如果还有其他方式,请告诉我.

你能帮我一下,并正确地说明如何用Reader做这个吗?如果我看到自己的例子如何完成,我可能会学得更快.

{-# LANGUAGE OverloadedStrings #-}

module DB where

import Data.Pool
import Database.MongoDB

-- Get data from config
ip = "127.0.0.1"
db = "index"

--Create the connection pool
pool :: IO (Pool Pipe)
pool = createPool (runIOE $ connect $ host ip) close 1 300 5

-- Run a database action with connection pool
run :: Action IO a -> IO (Either Failure a)
run act = flip withResource (\x -> access x master db act) =<< …
Run Code Online (Sandbox Code Playgroud)

haskell haskell-wai scotty

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

关于scotty Haskell Web框架的简单问题

考虑最简单的scotty应用程序:

{-# LANGUAGE OverloadedStrings #-}
import Web.Scotty

import Data.Monoid (mconcat)

main = scotty 3000 $ do
    get "/:word" $ do
        beam <- param "word"
        html $ mconcat ["<h1>Scotty, ", beam, " me up!</h1>"]
Run Code Online (Sandbox Code Playgroud)

我将此代码放入app.hs并使用GHC进行编译.我用它来运行它./app.简单.

  1. 当人们访问该网站时会发生什么?它只是一个./app正在运行的.每当每个用户触发get "/:word" $ do一行时,是否在同一个应用程序中创建了新的线程?有多少这样的线程可以存在?千?万?

  2. 运行./app后显示消息Setting phasers to stun... (port 3000) (ctrl-c to quit).但它没有显示更多.它不会输出传入的Web请求.我该怎么做呢?这对于记录目的很有用.

haskell haskell-wai haskell-warp scotty

10
推荐指数
2
解决办法
1604
查看次数

什么力量驱使WAI应用程序重新设计五次?

我对WAI界面进行了好奇的观察,虽然看起来很简单,但我惊讶地看到它在当前表格中需要多少次迭代才能稳定下来!

我曾认为CPS风格对于资源安全来说是最有趣的事情,但看起来还有很多值得学习的东西!

$ git log -p --reverse -- wai/Network/Wai.hs | grep '\+type Application'
+type Application = Request -> Iteratee B.ByteString IO Response
+type Application = Request -> ResourceT IO Response
+type Application = Request -> C.ResourceT IO Response
+type Application = Request -> IO Response
+type Application = Request -> (forall b. (Response -> IO b) -> IO b)
+type Application = Request -> (Response -> IO ResponseReceived)
                            -> IO ResponseReceived
Run Code Online (Sandbox Code Playgroud)

一些考古学产生了一些令人不满意的结果:

$ git log --reverse -G 'type …
Run Code Online (Sandbox Code Playgroud)

haskell haskell-wai

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

哪个Websockets库与Yesod一起使用?

我想知道是否有人可以解释Haskell websocket库之间的差异以及它们如何与Yesod一起工作.

我要介绍的两个主要示例是Network.Websocketswai websockets包的教程.

我无法为wai包找到一个好的例子或教程.既然yesod使用wai,它对简单的网络有什么优势呢?它是否意味着用于代替Network.Websockets或与Network.Websockets结合使用?

我见过一些例子,但我无法理解他们如何真正融入yesod环境.如果有人可以解释websockets如何与处理程序和IO相关联,那么在Yesod中,这将是很好的.

注意:我已经看到了这个问题这个问题,但我无法理解如何应用它们,因为它们实际上没有解释websockets适合Yesod的位置.

haskell websocket yesod haskell-wai

7
推荐指数
1
解决办法
1113
查看次数

Web Scotty:提供静态文件时找不到文件

这一定是非常愚蠢的事情.我刚刚开始玩scotty,无法正确提供静态内容.

import Network.HTTP.Types
import Web.Scotty
import qualified Data.Text as T
import Data.Monoid (mconcat)
import Data.Aeson (object, (.=))
import Network.Wai.Middleware.Static

main = scotty 3000 $ do
  middleware $ staticPolicy (noDots >-> addBase "static")
  get "/" $ file "index.html"
Run Code Online (Sandbox Code Playgroud)

很简单.这就是你在几本scotty教程中找到的内容.但由于某种原因它不起作用.在浏览器中通过'/'访问会给我'找不到文件'的东西.如果我在浏览器中键入"/index.html" - 它可以正常工作.但这是错的!我希望它可以通过'/'而不是'/index.html'访问.它忽略了root并直接获取html文件.如何通过'/'root提供index.html?没有太多的信息和我发现的几个教程指向上面的例子或类似的不能按预期工作.

我尝试将标题设置为'text/html',什么不是......没有运气.

haskell haskell-wai

7
推荐指数
1
解决办法
1635
查看次数

与Servant/Wai一起提供静态文件

我正在按照本教程http://www.parsonsmatt.org/programming/2015/06/07/servant-persistent.html通过servant创建API.我想自定义服务器以提供静态文件,但无法找到方法.

我正在使用stack构建工具.

我将Main.hs文件的运行修改为include static(run port $ static $ logger $ app cfg)并导入Network.Wai.Middleware.Static (static).我还添加wai-middleware-static >=0.7.0 && < 0.71到我的cabal文件中.

当我运行stack build我得到: (更新:这部分完全是我的错误,我添加了封装到错误的小集团文件..跛脚导入Network.Wai.Middleware.Static作品和静态文件留在以下情况下,错误.任何人都搜索它并发现它很有用.)

Could not find module ‘Network.Wai.Middleware.Static’
Perhaps you meant
  Network.Wai.Middleware.Gzip (from wai-extra-3.0.7.1@waiex_GpotceEdscHD6hq9p0wPOJ)
  Network.Wai.Middleware.Jsonp (from wai-extra-3.0.7.1@waiex_GpotceEdscHD6hq9p0wPOJ)
  Network.Wai.Middleware.Local (from wai-extra-3.0.7.1@waiex_GpotceEdscHD6hq9p0wPOJ)
Run Code Online (Sandbox Code Playgroud)

接下来我尝试使用servant serveDirectory如下(简化):

type  API = "users" :> Get   '[JSON]   [Person]
            :<|> "static" :> Raw
server = createPerson :<|> serveDirectory "/static" 
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

Couldn't match type ‘IO’ …
Run Code Online (Sandbox Code Playgroud)

haskell haskell-wai servant

7
推荐指数
1
解决办法
2072
查看次数

如何使用Scotty设置wai-handler-devel以自动重新加载代码?

我一直在玩Scotty Web框架,并尝试使用wai-handler-devel来启用代码重新加载.这是一个示例应用程序

{-# LANGUAGE OverloadedStrings #-}

module Example where

import Data.Monoid (mconcat)
import Network.Wai
import Web.Scotty

handler :: ScottyM ()
handler = get "/:word" $ do
  beam <- param "word"
  html $ mconcat ["<h1>Scotty, ", beam, " me up!</h1>"]

main :: IO ()
main = scotty 3000 handler
Run Code Online (Sandbox Code Playgroud)

这里的问题是wai-handler-devel期望得到一个(Application -> IO ()) -> IO ()使事情有效的功能,但在这种情况下我只有ScottyM ()IO ().包Web.ScottyWeb.Scotty.Trans包中有一些功能,即以下内容

scottyApp :: ScottyM () -> IO Application …

haskell yesod haskell-wai

6
推荐指数
1
解决办法
501
查看次数

针对每个请求数据的中间件

clojure,我可以写这样的东西:

(defn wrap-my-header
  [handler]
  (fn [request]
    (let [request (if (get-in request [:headers "my-header"])
                    (assoc request :has-my-header? true)
                    request)]
      (handler request))))
Run Code Online (Sandbox Code Playgroud)

在这个中间件,我检查,如果我在有一个非空值my-header:headers,如果是,我将在附加一些数据request映射.这表明我可以对待requestresponse作为一种有点"有状态"的数据.

我仍然是哈斯克尔的新人,并且想做类似的事情scotty.在查看中间件的类型后,我可以创建这样的中间件:

myMiddleware :: Middleware 
myMiddleware app req respond = app req respond
Run Code Online (Sandbox Code Playgroud)

在长时间盯着这个类型后,我仍然不知道该怎么做.一些阅读和思考让我认为这是不可能的,Middleware只能使处理程序短路和/或改变生成的响应.这是真的?


haskell clojure haskell-wai

6
推荐指数
1
解决办法
150
查看次数

如何限制WAI中请求正文和标头的大小?

我正在使用Scotty以及WAI开发应用程序。我希望能够限制请求的大小,包括正文长度和标头。我怎样才能做到这一点?是否可以使用普通的WAI中间件来实现?

haskell haskell-wai scotty

5
推荐指数
1
解决办法
309
查看次数

围模板功能找不到Libz.so

<command line>: can't load .so/.DLL for: libz.so (libz.so: cannot open shared object file: no such file or directory)

这是我在尝试安装某些WAI库时遇到的错误:

  • 围应用静电-3.1.6.2
  • 围的WebSockets-3.0.1.2

这似乎与模板Haskell有动态链接问题有关.链接到zlib(或libz或z或libz1g或其他任何月份包管理器选择调用标准压缩库的味道)的其他包工作正常,只有那些试图在编译时动态链接到它的包时间.

我用过 nix-env -i zlib && nix-shell -p zlib

我做apt-get installzlib1g,zlib1g-dev,lib32z1,zlib1g:i386,的libc6-I386, ,lib32stdc++6,lib32gcc1(?!)lib32ncurses5其他zlib的问题的建议.

whereis libz.so给人/usr/lib/x86_64-linux-gnu/libz.a /usr/lib/x86_64-linux-gnu/libz.so所以我觉得库实际安装.

我通过剥离所有的TH代码得到了一个精简版的wai-app-static工作,但我无法在不打破整个包的情况下从wai-websockets中提取它.

有没有人找到一种方法来安装这些库,最好是使用Nix,但是在这一点上我可以实现它.我已经尝试了三天来获得一个有效的构建,并且已经耗费了整个星期的项目时间,而没有编写我自己的代码.我会采取任何可行的黑客攻击.


有人要求使用命令行.这是由cabal生成的:

/home/jfmiller28/.nix-profile/bin/ghc --make -fbuilding-cabal-package -O -static -dynamic-too -dynosuf dyn_o -dynhisuf dyn_hi -outputdir dist/build -odir dist/build -hidir dist/build -stubdir dist/build -i -idist/build …
Run Code Online (Sandbox Code Playgroud)

haskell zlib yesod template-haskell haskell-wai

5
推荐指数
1
解决办法
310
查看次数