我想为我的webapp实现'graceful shutdown'命令(而不是我的第一直觉,就是要求人们杀死进程)
我的前两次尝试包括
liftIO exitSuccessE.yield (responseLBS statusOK [G.contentType "text/plain"] "") E.EOF两者都只是愉快地将结果返回给客户端并继续收听.应用程序可以做什么来杀死服务器?这甚至是一件合理的事情吗?
我承认我对iteratee没有很强的理解,只知道我可以消耗我的输入并且Iteratee是一个MonadIO实例.
我正在使用Yesod构建一个Web应用程序,目前我正在通过环境变量(根据Twelve-Factor App)传递API密钥等秘密,以避免将这些值存储在版本控制的配置文件中.例如,我在开发模式下运行我的应用程序,如下所示:
SOME_API_KEY=value yesod devel
Run Code Online (Sandbox Code Playgroud)
我的config/settings.yml文件中有一个值,该值是根据此环境变量定义的,其值为空值,如下所示:
meetup-api-key: "_env:SOME_API_KEY:"
Run Code Online (Sandbox Code Playgroud)
要使用Keter进行部署,我将使用该yesod keter命令构建Keter包,并将生成的文件放入Keter的incoming目录中.由于我使用环境变量配置,我的应用程序的.keter文件不包含SOME_API_KEY值(这是故意的).
我应该如何SOME_API_KEY进入在Keter内部运行的应用程序实例?
我想避免将价值烘焙到我keter-config.yaml的至少以下三个原因:
我希望在这种情况下有一些"最佳实践".
我使用persistent来保存以下记录(时间是UTCTime).
type Price = Int
type Volume = Int
share [mkPersist sqlSettings, mkMigrate "migrateBook"]
[persistLowerCase|
Level
limit Price
volumes [Volume]
deriving Show Read Eq
Book
time Time
asks [Level]
bids [Level]
deriving Show Read Eq
|]
Run Code Online (Sandbox Code Playgroud)
当我迁移结构时,我得到一个Book表:
CREATE TABLE book
(
id serial NOT NULL,
"time" timestamp without time zone NOT NULL,
asks character varying NOT NULL,
bids character varying NOT NULL,
CONSTRAINT book_pkey PRIMARY KEY (id )
)
Run Code Online (Sandbox Code Playgroud)
和一个表级别:
CREATE TABLE level
(
id serial NOT NULL,
"limit" double …Run Code Online (Sandbox Code Playgroud) 我有一些旧的代码,它在Web API上公开服务,它基本上用于HTTP动词.我想将此项目移至使用超媒体控件(HATEOAS).我想知道是否有任何库已经支持根据HAL或JSON-LD规范在子资源的资源表示中嵌入链接.我用Google搜索了但我找不到任何东西.很高兴知道Yesod,Snap或Happstack等成熟项目是否计划支持此功能?
编辑:为了澄清,我对REST成熟度模型的第3级感兴趣
我的应用程序使用bookmarklet,我需要允许CORS,MyRouteR因此我的bookmarklet代码可以使用此路由进行AJAX请求.
在我的配置/路由初稿中,我MyRouteR只支持一种请求方法PUT.但事实证明,我还需要支持OPTIONS方法,这些浏览器用于CORS预检请求.
我在config/routes中得到了以下结果:
/myroute MyRouteR PUT OPTIONS
Run Code Online (Sandbox Code Playgroud)
我有点希望在模板Haskell中有一些相关的机制来处理配置/路由,这样在这个路由的方法列表中添加OPTIONS会自动导致CORS支持,但没有骰子.不是世界末日,但它会有意义并且感觉优雅.
为了使CORS工作,我给路由一个OPTIONS处理程序:
optionsMyRouteR :: Handler RepPlain
optionsMyRouteR = do
addHeader "Access-Control-Allow-Origin" "*"
addHeader "Access-Control-Allow-Methods" "PUT, OPTIONS"
return $ RepPlain $ toContent ("" :: Text)
putMyRouteR :: Handler RepJson
putMyRouteR = do
addHeader "Access-Control-Allow-Origin" "*"
-- more stuff ...
Run Code Online (Sandbox Code Playgroud)
这是有效的,但感觉有点不太正常,因为它是如此的样板.那么,有两个问题:
我设法使用Yesod成功编写了一个小应用程序.现在我处于我希望为其添加更好的交互的阶段,我想使用AngularJS来做到这一点.
据我所知,Yesod对AngularJS的支持仍然是实验性的.而且,到目前为止我找到的文档对我来说是无法访问的.我没有掌握所有的Yesod概念.
所以我想知道,有哪些方法可以集成AngularJS和Yesod框架.我在想的是:
理想情况下,我想在Haskell中编写所有内容,但在目前的情况下可能不可能.因此,我想问一下,我想到的替代方案是否是一个好方法,以及是否有办法改进它.
谢谢.
使用yesod 0.8.0,我试图从这个示例请求中检索帖子消息的正文:
curl -v -H "Accept: application/json" -H "Content-Type: application/json" -X POST -d '{"name":"oscar"}' http://localhost:3000/user/xyz
Run Code Online (Sandbox Code Playgroud)
在我的处理程序中,我看到它的唯一方法是使用
(pp, files) <- runRequestBody
Run Code Online (Sandbox Code Playgroud)
但由于内容类型的原因,这会失败.还有其他功能吗?
我浏览了yesod书和来源,并了解了一切如何运作.但在我写自己的东西之前,脚手架网站中有一件事我不明白.
所以我在一个网站"copywww"上加工,在文件CopyWWWState.hs中有代码:
instance YesodPersist CopyWWWState where
type YesodDB CopyWWWState = SqlPersist
runDB db = liftIOHandler
$ fmap connPool getYesod >>= Settings.runConnectionPool db
instance YesodAuth CopyWWWState where
type AuthId CopyWWWState = UserId
-- Where to send a user after successful login
loginDest _ = RootR
-- Where to send a user after logout
logoutDest _ = RootR
getAuthId creds = runDB $ do
x <- getBy $ UniqueUser $ credsIdent creds
case x of
Just (uid, _) -> return $ Just …Run Code Online (Sandbox Code Playgroud) 更新:运行ghc-pkg检查报告:
~: ghc-pkg check
WARNING: cache is out of date: /Library/Frameworks/GHC.framework/Versions/7.0.3i386/usr/lib/ghc-7.0.3/package.conf.d/package.cache
use 'ghc-pkg recache' to fix.
~: ghc-pkg recache
Run Code Online (Sandbox Code Playgroud)
在那之后,cabal似乎更快乐了!
尝试安装yesod但第一次安装失败的原因是:
Building attoparsec-0.9.1.1...
Building library...
Creating dist/build (and its parents)
/usr/bin/ghc --make -package-name attoparsec-0.9.1.1 -hide-all-packages -fbuilding-cabal-package -i -idist/build -i. -idist/build/autogen -Idist/build/autogen -Idist/build -optP-DAPPLICATIVE_IN_BASE -optP-include -optPdist/build/autogen/cabal_macros.h -odir dist/build -hidir dist/build -stubdir dist/build -package-id base-4.3.1.0-167743fc0dd86f7f2a24843a933b9dce -package-id bytestring-0.9.1.10-77e44adc4117472276bab802bea3c036 -package-id containers-0.4.0.0-18deac99a132f04751d862b77aab136e -package-id deepseq-1.1.0.2-09b3aed0c4982bbc6569c668100876fa -O -Wall -XHaskell98 -XCPP Data.Attoparsec Data.Attoparsec.Char8 Data.Attoparsec.Combinator Data.Attoparsec.FastSet Data.Attoparsec.Lazy Data.Attoparsec.Number Data.Attoparsec.Zepto Data.Attoparsec.Internal Data.Attoparsec.Internal.Types
<command line>: cannot satisfy -package-id deepseq-1.1.0.2-09b3aed0c4982bbc6569c668100876fa
(use -v …Run Code Online (Sandbox Code Playgroud) 如何向Persistent声明我有一个表,其主键是两个字段的组合?
例如,假设我有一个包含first_name和last_name的表,那么在SQL语法中我需要类似的东西:
CONSTRAINT pk_PersonID PRIMARY KEY (first_name,last_name)
Run Code Online (Sandbox Code Playgroud)
谢谢,
haskell ×10
yesod ×10
persistent ×2
ajax ×1
angularjs ×1
bookmarklet ×1
cors ×1
database ×1
deployment ×1
happstack ×1
hateoas ×1
javascript ×1
json ×1
keter ×1
macos ×1
orm ×1
rest ×1