2012-02-27 3 views
1

私はappengineでwebapp2 sessions libを使用しています。私のアプリケーションでは、クッキーのデフォルトパスは/ですが、私は特別なクッキーを/api/.*上でのみ有効にします。 set_cookieメソッドでは、新しいCookieの構成を指定することはできず、Cookieの名前とバックエンドのみが指定されています。私はまた、クッキーを作成した後でパスを変更する方法も見つけませんでした。webapp2のクッキーパスを変更する

from webapp2_extras import sessions 


sessions_store = sessions.get_store(request=self.request) 
special_cookie = sessions_store.get_session(name='special_cookie', backend='securecookie') 

... # change ``special_cookie`` path ? how? 

ありがとうございます!

答えて

3

あなたはセッションデータを使用しているCookieを使用していません。それは全く違う。 Cookieはブラウザに保存され、セッションはサーバーに保存されます。セッションのアイデアはサイドワイドなので、パス固有のロジックを手動で実装する必要があります。

あなたが特定のパスと実際のクッキーを使用する場合、それは簡単でdocumented in the web2py docsだ:

response.cookies['mycookie'] = 'somevalue' 
response.cookies['mycookie']['expires'] = 24 * 3600 
response.cookies['mycookie']['path'] = '/' 

セッションとクッキーの違いは何ですか?クッキーは、ブラウザに保存されている情報の単一のチャンクです。です。あなたはショッピングカートの内容のトラックに加え、フォントサイズ設定を維持したいのであれば、たとえば、次のようなので、いくつかのクッキーを保存することがあります

  • SHOPPING_CART:アイテム1、アイテム2、ITEM3
  • FONT_SIZE:
  • 12ptのを
  • NAME:フレッド

これらの変数のそれぞれは、ブラウザのクッキーとを格納されます。セッションでは、あなただけのブラウザでの情報の一片を格納し、SESSION_ID:

  • SESSION_ID:56a3y678

その後サーバ側に、あなたはそれかもしれないセッションのデータベースを持っています

| SESSION_ID | KEY   | VALUE 
--------------------------------------------------- 
| 56a3y678 | shopping-cart | Item1,Item2,Item3 
| 56a3y678 | font-size  | 12pt 
| 56a3y678 | name   | Fred 

このサーバー側のような情報を保存することには多くの利点があります。 1つは、ブラウザーよりも多くの情報を格納できます。また、サーバーは独自のデータベースを保持しているため、より安全に信頼できるようになります。 is_admin_userのクッキーは信頼できませんでしたが、セッション変数は一般的に可能でした。

明らかに、ブラウザを使用してすべてを更新する代わりに、サーバーソフトウェアに依存しているという欠点があります。たとえば、10台のWebサーバーがあり、それらの間を回転するユーザーがいる場合は、すべてが同じセッションデータベースと対話して正しく機能する必要があります。デフォルトSessionStoreクラスによって

+0

ありがとうKen!私が理解するように、セッションは何とかクッキーに基づいていますね。私はwebapp2のセッションlibに固執することを好むでしょう。しかし、私が探しているものを達成するために他の方法を見つけることができなければ、少なくともクッキーを作るためにあなたのアイデアを実装します。再度、感謝します! –

+0

問題ありません。セッション変数とCookieの違いを説明するために私の答えを更新しました。 –

+0

ありがとうKen!私がやることは、アプリを「逸らす」ことです。 AppengineはカスタムドメインでSSLをサポートしていないため、https:// .appspot.com(バックエンド)へのクロスサイトリクエストを行います。名前空間をクッキーに乗ってバックエンドに転送します。フロントエンドは、ユーザーがバックエンドですでに認証されているかどうかを示すブール値を持つクッキーを使用します。名前空間は安全な接続を介してのみ送信されるため、フロントエンドのクッキーがsnniferによってキャプチャされることは大きな問題ではありません。また、名前空間はsecurecookie内で暗号化されているため、ユーザーは変更できません。 –

1

cookie_argsためpath'/'に設定されているdefault configuration optionsを、使用してインスタンス化されます。

Cookieのパスを変更する場合は、 /apiの場合は、SessionStoreクラスの独自のインスタンスを作成する必要があります。上書きされた構成値でインスタンス化することができます。この方法では、指定したパスに対してのみ有効なセッションストアを持つことができます。

+0

このアイデアは私の心に '' sessions.py''ソースを読んでいました。しかし、私はSessionStoreサブクラスを '' get_store''関数に渡す方法を知りません。この機能も再実装する必要がありますか? :/ –

関連する問題