2012-04-03 3 views
5

私は、スナップセッションの使い方の例を取り上げています。これまでのところはありません。 誰かが、クッキーベースのセッションの簡単な例を挙げて、記事や何かを教えてください。ハスケルスナップ:セッションの例

コードスニペットは非常にうまく処理されます。 セッションにユーザー名を入れて、すべての要求の前にその存在と妥当性をチェックするようなもの。私はSnap.extension.sessionを見ましたが、私はまだライブラリー・コードからそれを使用する方法を理解するにはあまりにも午後です。

私はsetInSessionがクッキーにセッション値を置くための機能であることを理解し、私はかなりの署名から、それを使用する方法を見つけ出すカント:

setInSession k v = Map.insert k v `liftM` getSession >>= setSession 

またはどのように一緒に全体のことをGLUします。

例のコードを少し尋ねるルールに違反しているかどうかはわかりませんが、ネット上で何かを見つけることができれば私はしません。

ありがとうございます。

--- --- UPDATE

は、私は以下の例に続き、リンクが、物事はまだ右アウト来ていません。

私はちょうどキーと値を読み取り、それをセッションクッキーに入れて、セッション値を読み込んで表示したいという簡単なテストをしたいのです。

私はセッションを初期化し、アプリケーションのメイン状態にしました。

s <- nestSnaplet "" sess $ initCookieSessionManager "config/site_key.txt" "sess" (Just 3600) 

最初の混乱は、セッション初期化のファンに必要なキーです。 初期プロジェクトのセットアップ中にキーは作成されません。

どうすれば作成できますか? プロジェクトのファイル構造内にキーがあるので、関数はそれを見つけることができますか?

はその後ハンドラ:

putCookie :: Handler App App() 
putCookie = do 
    par <- getPostParams 
    let k = T.decodeUtf8 $ head (par ! (B.pack "key")) 
    let v = T.decodeUtf8 $ head (par ! (B.pack "value")) 
    with sess $ setInSession k v 
    heistLocal (bindString "message" "Cookie inserted!") $ render "reply" 

この1つだけのWebフォームからキーと値を読み取り、クッキーにキーと値のペアを置くことになっています。まあ、明らかにそうではありません。

shCookie :: Handler App App() 
shCookie = do 
    v <- with sess $ getFromSession "key" 
    heistLocal (bindString "message" (fromMaybe "" v)) $ render "reply" 

これはただ読んで表示します。私はいつも空の文字列を取得します。つまり、そのようなことはありません。

上記のいずれかが間違っていますか?どこで私は間違いをしますか? すべてが正しくコンパイルされますが、セッションCookieは存在しません。

答えて

3

Snap.extension.sessionthisモジュールを意味しますか? AFAIK snap-authパッケージは非推奨です。

snapletとして実装された新しいsession apiを使用できます。

exampleセッションと認証スナップショットを使用するようにアプリケーションを設定する方法を確認してください。その後、セッションにデータを格納することができるようになります:

data App = App 
{ _heist :: Snaplet (Heist App) 
, _sess :: Snaplet SessionManager 
, _auth :: Snaplet (AuthManager App) 
} 
makeLens ''App 

myHandler :: Handler App App() 
myHandler = do 
    with sess $ setInSession "key" "value" 

を追加しました:サイトキーと

ファイルが自動的に作成されます。機能initCookieSessionManagerhereと定義)はclientsessionパッケージのgetKey機能を使用します(here参照)。ドキュメントから:If the file does not exist or is corrupted a random key will be generated and stored in that file.

私はあなたがセッションを更新し、すべてのハンドラでそれをコミットする、またはそれを行うにはwrapHandlersおよび/またはwithSessionを使用することができます(commitSessionhereを参照)を使用すると、セッションをコミットしていないcosをあなたのハンドラが動作しないと思います自動的に。

+0

ありがとうございます。私はあなたのリンクに従ったが、物事は何らかの理由でまだ仕事をしていない。私は混乱の点を少しでも残して、元の質問を更新します。 –

+0

更新された回答を見る – Yuras

+0

ニース。今はすべてが動作します。私が必要としたのは、あなたが提案したようにcommitSessionを追加することでした。ありがとうございました。大きな助け。 –

関連する問題