Django:如何扩展SessionBase以访问请求对象?

问题描述 投票:0回答:2

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

一切都在完美地工作,远远超过一个巨大的但是。

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

我已经了解到使用上面的答案(基本上将请求对象绑定到设置,因此您可以使用导入设置*然后使用settings.request访问)是非常可怕的,并且绝对是最糟糕的方式。

我的核心问题是,我不明白如何从我编写的自定义会话后端访问请求。

python django session request middleware
2个回答
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

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

© www.soinside.com 2019 - 2024. All rights reserved.