使用 Haskell 向现有 Yesod 项目添加身份验证
Adding Authentication to existing Yesod project with Haskell
我一直在使用 this guide 来为我的项目添加身份验证和授权。我是 Yesod 的新手,运行遇到了一些问题:
我正在使用以下基础数据:
data App = App (TChan Text)
为了我的身份验证,我需要这种数据类型:
data App = App SqlBackend
如何将两者结合起来?然后我还必须更改现有功能吗?
最后我运行一切都是这样的:
main :: IO ()
main = runNoLoggingT $ withSqliteConn "email.db3" $ \conn -> liftIO $ do
runSqlConn (runMigration migrateAll) conn
chan <- newTChanIO
warp 3000 $ App chan
-- Backend SqlBackend needs to be initilized with conn (see below)
{- OLD
main = do
chan <- newTChanIO
warp 3000 $ App chan
-}
{- NEW
main = runNoLoggingT $ withSqliteConn "email.db3" $ \conn -> liftIO $ do
runSqlConn (runMigration migrateAll) conn
warp 3000 $ App conn
-}
我知道我必须将两者结合起来。我读 this article。我如何将 chan
和 conn
放在一起?这听起来可能微不足道,但那里的文档很少。
请帮帮我!
通常人们将他们的 App
数据类型设置为具有多个字段的记录。例如,scaffolded Yesod project 使用此代码:
data App = App
{ appSettings :: AppSettings
, appStatic :: Static -- ^ Settings for static file serving.
, appConnPool :: ConnectionPool -- ^ Database connection pool.
, appHttpManager :: Manager
, appLogger :: Logger
}
您链接到的 example code 也是这样做的:
data App = App
{ homepageContent :: Html
, visitorCount :: IORef Int
}
那么像这样的事情呢:
-- Small caveat: this is code untested
data App = App
{ backend :: SqlBackend
, chan :: TChan Text
}
main :: IO ()
main = do
chan <- newTChanIO
runNoLoggingT $ withSqliteConn "email.db3" $ \conn -> liftIO $ do
runSqlConn (runMigration migrateAll) conn
warp 3000 $ App { backend=conn, chan=chan}
您必须更改访问您的 TChan
的旧代码,但是一旦您的应用成为记录,您就可以添加更多字段而无需更改代码库的其余部分。
附带说明一下,您是否考虑过使用 Yesod scaffolding?您将从为您处理所有这一切开始,并为您实施一系列其他细节和最佳实践。
我一直在使用 this guide 来为我的项目添加身份验证和授权。我是 Yesod 的新手,运行遇到了一些问题:
我正在使用以下基础数据:
data App = App (TChan Text)
为了我的身份验证,我需要这种数据类型:
data App = App SqlBackend
如何将两者结合起来?然后我还必须更改现有功能吗?
最后我运行一切都是这样的:
main :: IO ()
main = runNoLoggingT $ withSqliteConn "email.db3" $ \conn -> liftIO $ do
runSqlConn (runMigration migrateAll) conn
chan <- newTChanIO
warp 3000 $ App chan
-- Backend SqlBackend needs to be initilized with conn (see below)
{- OLD
main = do
chan <- newTChanIO
warp 3000 $ App chan
-}
{- NEW
main = runNoLoggingT $ withSqliteConn "email.db3" $ \conn -> liftIO $ do
runSqlConn (runMigration migrateAll) conn
warp 3000 $ App conn
-}
我知道我必须将两者结合起来。我读 this article。我如何将 chan
和 conn
放在一起?这听起来可能微不足道,但那里的文档很少。
请帮帮我!
通常人们将他们的 App
数据类型设置为具有多个字段的记录。例如,scaffolded Yesod project 使用此代码:
data App = App
{ appSettings :: AppSettings
, appStatic :: Static -- ^ Settings for static file serving.
, appConnPool :: ConnectionPool -- ^ Database connection pool.
, appHttpManager :: Manager
, appLogger :: Logger
}
您链接到的 example code 也是这样做的:
data App = App
{ homepageContent :: Html
, visitorCount :: IORef Int
}
那么像这样的事情呢:
-- Small caveat: this is code untested
data App = App
{ backend :: SqlBackend
, chan :: TChan Text
}
main :: IO ()
main = do
chan <- newTChanIO
runNoLoggingT $ withSqliteConn "email.db3" $ \conn -> liftIO $ do
runSqlConn (runMigration migrateAll) conn
warp 3000 $ App { backend=conn, chan=chan}
您必须更改访问您的 TChan
的旧代码,但是一旦您的应用成为记录,您就可以添加更多字段而无需更改代码库的其余部分。
附带说明一下,您是否考虑过使用 Yesod scaffolding?您将从为您处理所有这一切开始,并为您实施一系列其他细节和最佳实践。