2017-02-04 13 views
2

カスタムDjangoミドルウェア(Django 1.9)を使用して、匿名ユーザーがサイトの条件を受け入れるかどうかを確認したいです。&条件 - まだ表示されていない場合はダイアログを表示します「同意する」をクリックした。Djangoミドルウェア内のCookieを設定する

私はこれをデータベースに保存する必要はなく、単にCookieを使用することをお勧めします。私はsettings.pyに次のようにあります

MIDDLEWARE_CLASSES = [ 
    'django.middleware.security.SecurityMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    ... 
    'myapp.middleware.app_custom_middleware.TermsMiddleware',] 

SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' 

私はその後、TermsMiddlewareでは非常に初歩的な何かしようとしている - ここで私が意図的にちょうどそれが動作するように取得しようとする要求レスポンスを変更しようとしている:

class TermsMiddleware(object): 

    def process_request(self, request): 
     request.session['myCookieKey'] = 'myCookieValue' 
     request.session.save() 
     return 

    def process_response(self, request, response): 
     request.session['myCookieKey'] = 'myCookieValue' 
     request.session.save() 
     return response 

私はブラウザに応答を検査した場合、私はmyCookieKeyが設定されていないことがわかり、私は、私は、これが書かれるべきか誤解したと思います。

このようなミドルウェア内でセッションを操作しても、Djangoが送信しようとしていた応答で送信されたCookieに影響を与えることはできますか?私ができるはずのようなドキュメントは、次のようにする必要があります。

NoneまたはHttpResponseオブジェクトを返さなければなりません。 Noneを返すと、Djangoは の他のprocess_request()ミドルウェア、process_view()ミドルウェア、 を実行し、最後に適切なビューを実行してこのリクエストを処理し続けます。 HttpResponse オブジェクトを返す場合、Djangoは他の要求、ビュー、または 例外ミドルウェア、または適切なビューを呼び出すことはありません。そのHttpResponseに応答 ミドルウェアを適用し、結果を返します。

また、ビュー機能の外でSessionStore()を使用するようにドキュメントの注記を参照しました。理論的には、request(およびresponse)へのアクセス権があるので、私はここでそれを行う必要があるとは思わない。私はとにかくそれを試みた、と私はまだそれを働かせることができませんでした。

大変助けてください!

答えて

2

あなたが誤解したことは、セッションとCookieの関係です。

セッションを変更して任意のCookieを設定することはできません。セッションは、通常はdbまたはファイルに格納されたデータの集まりであり、唯一のクッキーは現在のユーザーのセッションキーを含むものです。

ミドルウェアのセッションは確かに変更できますが、どこにいてもCookieが設定されているとは限りません。

(別に、あなたはセッションが辞書のようなインターフェースを介してアクセスされる直接__setitem__のような二重のアンダースコアメソッドを呼び出してはなりません:request.session['foo'] = 'bar'。。)返信ダニエルため

+0

おかげ - これが事実であるならば、何がします"CookieにはセッションIDが含まれています - データ自体ではありません(Cookieベースのバックエンドを使用していない限り)。"後者の部分は、Cookieベースのバックエンドを使用しているため、Cookie内のデータそのものを実際に表示する必要があるようです。そしてyes、dictインターフェースの使用に同意します - 上記のコードを編集します。 –

+1

それでもセッションクッキーですが、各値に固有のものではありません。そのクッキーでは、セッションデータは暗号化された形式で保存されます。キーと値は表示されません。 –

関連する問題