2017-09-09 18 views
0

私はhttps://github.com/kataras/iris golang web frameworkを使用しています。表示するユーザー情報を取得する - Golang Template

  1. ここに今すぐユーザー登録
  2. ユーザー確認済み
  3. セッションにログイン&を作成し、ユーザーにキーusernameで設定します(表&構造体)username

、 - :私は事の下に行っていますログインユーザーのための私のコードです: -

// Loaded All DB and other required value above 

allRoutes := app.Party("/", logThisMiddleware, authCheck) { 
    allRoutes.Get("/", func(ctx context.Context) { 
     ctx.View("index.html"); 
    }); 
} 
今authcheckミドルウェアで

func authcheck(ctx context.Context) { 
    // Loaded session. 
    // Fetched Session key "isLoggedIn" 
    // If isLoggedIn == "no" or "" (empty) 
    // Redirected to login page 
    // else 
    ctx.Next() 
} 

マイセッション機能

func connectSess() *sessions.Sessions { 
    // Creating Gorilla SecureCookie Session 
    // returning session 
} 

、私の問題は、私は、テンプレート内のすべてのルートにログインしたユーザーの価値を共有しないか、です。私の現在のオプションは次のとおりです。 -

// Loaded all DB and required value 
allRoutes := app.Party("/", logThisMiddleware, authCheck) { 

    allRoutes.Get("/", func(ctx context.Context) { 
     // Load Session again 
     // Fetch username stored in session 
     // Run Query against DB 
     // Share the user struct value. 
     // Example ctx.ViewData("user", user) 
     ctx.View("index.html"); 
    }); 

    allRoutes.Get("dashboard", func(ctx context.Context) { 
     // Load Session again 
     // Fetch username stored in session 
     // Run Query against DB 
     // Share the user struct value. 
     // Example ctx.ViewData("user", user) 
     ctx.View("index.html"); 
    }); 
} 

しかし、上記のコードの問題は、私は各ルートのためのセッションを書き、私が実行し、各ルートのためにとシェアよりも、もう一度クエリを実行する必要がありますされています。

authCheckミドルウェアと2番めのallRoutes.Getルートにそれぞれ1回ずつセッションをロードするのではなく、より良い方法が必要です。

私はこれを最適化することができ、ユーザデータは単にコードを一度書いて、それが簡単にあなたが作るためにctx.Values().Set/Getを使用することができます各ルートについては、以下

 // Load Session again 
     // Fetch username stored in session 
     // Run Query against DB 
     // Share the user struct value. 
     // Example ctx.ViewData("user", user) 

答えて

2

を繰り返していないことにより、テンプレートに共有することができる方法についてのアイデアを必要としますあなたのルートのハンドラまたはミドルウェアの間で共有できるもの。

// load session manager once 
sess := connectSess() 

func authCheck(ctx context.Context) { 
    session := sess.Start(ctx) 
    // Load your user here. 
    // [...] 
    // Save the returning user to the local storage of this handlers chain, once. 
    ctx.Values().Set("user", user) // <-- IMPORTANT 
} 

app.Get("/", func(ctx context.Context) { 
    // Get the user from our handlers chain's local storage. 
    user := ctx.Values().Get("user") // <-- IMPORTANT 

    // Bind the "{{.user}}" to the user instance. 
    ctx.ViewData("user", user) 
    // Render the template file. 
    ctx.View("index.html") 
}) 

app.Get("dashboard", func(ctx context.Context) { 
    // The same, get the user from the local storage... 
    user := ctx.Values().Get("user") // <-- IMPORTANT 

    ctx.ViewData("user", user) 
    ctx.View("index.html") 
}) 

これはすべて、かなり簡単ですね。

しかし、私はのためののノートがあります、あなたはもっと時間があればそれらをお読みください。

ルート「/」にしている場合は、あなたがミドルウェアを追加するためにそれのためのパーティー(.Party)を作成する必要はありませんが((Useを開始)または仕上げ(Done))、ちょうどiris.Applicationインスタンスを使用し、 app.Use/Done

はこれを書き込まないでください:それはを読み、理解することは簡単です

app.Use(logThisMiddleware, authCheck) 
app.Get("/", myHandler) 

allRoutes := app.Party("/", logThisMiddleware, authCheck) { 

    allRoutes.Get("/", myHandler) 
} 

ではなく、ということですか。

私はあなたの関数の末尾に;を使用していることに気づいたあなたは、あなたがそれを行うべきではないのGoプログラミング言語を使ってプログラムを書くとき、あなたのエディタとgocodeツールは、それらを削除します、すべて;を削除します。

最後に、ドキュメントと例をお読みください。https://github.com/kataras/iris/tree/master/_examplesでそれらの多くがあり、あなたが一番いいと思います!

+0

うわー!それは簡単でした! 'userルート'と 'allRoutes'と' adminルート 'と' adminRoutes'を区別しようとしていたので、 'Party'を使用することにも何らかの害があります。それを使ってパフォーマンス上の問題はありますか? –

+0

'app.Use'を使って、デフォルトのタイトル、ホスト、レイアウトファイル、設定テーブルのデータを共有しました。 'app.Party'を避けることをお勧めしますか?もしそうなら、私に知らせてください、なぜ! –

+1

いいえ、あなたがルートルートのために 'パーティー(Party)をしたいなら、パフォーマンスコストも害はありません。 – kataras

関連する問題