0

我有一个自定义会话类,用于扩展 Django SessionBase。我这样做是为了重用遗留的 Session 表,以便会话可以在我们的 Django 页面和 PHP 页面之间传递,而无需用户登录和退出。

到目前为止,一切都运行良好,但只有一个巨大的 BUT。

为了让 SessionStore.start() 函数可以访问请求对象,我编写了一些自定义中间件。不幸的是,为了做到这一点,我使用了这个答案:从 backend.get_user 访问 request.session以解决我的问题。

我了解到,使用上述答案(基本上将请求对象绑定到设置,因此您可以使用 import settings* 然后 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 回答