2017-07-08 8 views
1

最近、データベースバックアップされたセッションからmemcached経由で保存されたセッションにpylibmcを使用して移行しました。ここでMemcache経由のDjangoセッション:手動でセッションキーを見つけることができません。

が私のキャッシュである、私のsettings.pyでSESSION_CACHE_ALIAS & SESSION_ENGINE

CACHES = { 
    'default': { 
     'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache', 
     'LOCATION': ['127.0.0.1:11211'], 
    } 
} 


SESSION_CACHE_ALIAS = 'default' 


SESSION_ENGINE = "django.contrib.sessions.backends.cache" 

すべてが舞台裏で正常に動作していると私はそれが新しいキャッシュシステムを使用していることがわかります。 pylibmcからget_stats()メソッドを実行すると、キャッシュ内の現在のアイテムの数が表示され、1になったことがわかります。

問題は、pylibmcを使用して手動でセッションを取得できません。 views.pyのリクエストセッションデータを検査する際に

def my_view(request): 
    if request.user.is_authenticated(): 

     print request.session.session_key 
     # the above prints something like this: "1ay2kcv7axb3nu5fwnwoyf85wkwsttz9" 

     print request.session.cache_key 
     # the above prints something like this: "django.contrib.sessions.cache1ay2kcv7axb3nu5fwnwoyf85wkwsttz9" 

     return HttpResponse(status=200) 
    else: 
     return HttpResponse(status=401) 

私はcache_keyを印刷するときSESSION_KEYことはなかったのに対し、それはデフォルトのKEY_PREFIXで印刷していることに気づきました。コード内のコメントを見て、私が何を意味するのか見てみましょう。

だから私は、「これらのキー名のいずれかが動作するはずです、[OK]を偉大な私はちょうど教育目的のために手動でセッションデータをつかんでみましょう。」、考え出し:

import pylibmc 

mc = pylibmc.Client(['127.0.0.1:11211']) 

# Let's try key "1ay2kcv7axb3nu5fwnwoyf85wkwsttz9" 

mc.get("1ay2kcv7axb3nu5fwnwoyf85wkwsttz9") 

うーんと何も起こらない、何のキーがそのことにより、存在しません名。さて、心配しないで、cache_keyを試してみましょう、それは間違いなく正しく動作するはずですか?

mc.get("django.contrib.sessions.cache1ay2kcv7axb3nu5fwnwoyf85wkwsttz9") 

何ですか?どのように私はまだ何も戻ってきていないですか?私がテストするとき、私はそれが動作するかどうかを確認するためにランダムなキー値を設定して取得することにします。キーが存在することを確認するためにget_stats()を再度実行します。私はまた、実際に私のセッションが動作しているかどうかを確認するためにWebアプリケーションをテストします。これは、私が気付いていない別の命名規則があると結論づけます。

もしそうなら、正しい命名方式は何ですか?

答えて

3

はい、Djangoで内部的に使用されるキャッシュキーは、一般にキャッシュバックエンド(この場合はpylibmc/memcached)に送信されるキーとは異なります。これらの2つのキーをdjangoキャッシュキーと最終的なキャッシュキーとそれぞれ呼ぶことにしましょう。

request.session.cache_keyで与えジャンゴキャッシュキーは、例えば、Djangoの低水準のキャッシュAPIを使用するためです:

>>> from django.core.cache import cache 
>>> cache.get(request.session.cache_key) 
{'_auth_user_hash': '1ay2kcv7axb3nu5fwnwoyf85wkwsttz9', '_auth_user_id': u'1', '_auth_user_backend': u'django.contrib.auth.backends.ModelBackend'} 

一方最終キャッシュキーkey prefixの組成物であり、 、djangoキャッシュキー、およびキャッシュversion numberがあります。 make_key機能(ジャンゴからdocs)は、これら3つの値は、このキーを生成するために構成されている方法を示しています。デフォルトでは

def make_key(key, key_prefix, version): 
    return ':'.join([key_prefix, str(version), key]) 

key_prefixが空の文字列であるとversionは1です。

は最後に、make_keyを検査することにより、我々はmc.getに渡す正しい最終キャッシュキーはフォーム<KEY_PREFIX>:<VERSION>:<KEY>を持って

:1:django.contrib.sessions.cache1ay2kcv7axb3nu5fwnwoyf85wkwsttz9 

であることがわかります。

注:最後のキャッシュキーは、キャッシュ設定でKEY_FUNCTIONと定義することで変更できます。

関連する問題