0

Django SessionBase を拡張するために作成したカスタム セッション クラスがあります。レガシー セッション テーブルを再利用するためにこれを行いました。これにより、ユーザーがログインして戻ることなく、セッションが Django ページと PHP ページの間を通過できるようになります。

これまでのところ、1つの巨大なBUTで、すべてが完全に機能しています。

SessionStore.start() 関数が Request オブジェクトにアクセスできるようにするために、いくつかのカスタム ミドルウェアを作成しました。残念ながら、それを行うために、私はこの答えを使用しました:私の問題を解決するためにbackend.get_user から request.session にアクセスしてください。

上記の回答を使用すること(本質的にリクエストオブジェクトを設定にバインドするため、インポート設定*を使用してアクセスし、次にsettings.requestを使用できます)は完全に恐ろしく、これを行うための絶対に最悪の方法であることを学びました。

私の中心的な問題は、私が書いたカスタム セッション バックエンド内からリクエストにアクセスする方法を理解していないことです。

4

2 に答える 2

2

ミドルウェアでは、次のSessionStoreようにリクエストをカスタムに渡すことができます。

request.session = engine.SessionStore(session_key,request)

そしてSessionStoreで:

class SessionStore(SessionBase):
    def __init__(self, session_key=None, request):
        self.request = request
        super(SessionStore, self).__init__(session_key)

request後で、としてアクセスできますself.request

于 2012-11-28T23:28:35.650 に答える
1

Django の SessionMiddleware はこれを行います:

class SessionMiddleware(object):
    def process_request(self, request):
        engine = import_module(settings.SESSION_ENGINE)
        session_key = request.COOKIES.get(settings.SESSION_COOKIE_NAME, None)
        request.session = engine.SessionStore(session_key)

あなたはこれを行うことができませんか?

import mycustomsessionbackend as myengine

class MyCustomSessionMiddleware(object):
    def process_request(self, request):
        session_key = request.COOKIES.get(settings.SESSION_COOKIE_NAME, None)
        request.session = myengine.SessionStore(session_key, request)

...

# mycustomsessionbackend.py
class SessionStore(SessionBase):
    def __init__(self, session_key=None, request=None):
        super(SessionStore, self).__init__(session_key)
        self.request = request
于 2012-11-28T23:27:13.960 に答える