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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django:如何扩展SessionBase以访问请求对象?相关的知识,希望对你有一定的参考价值。

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

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

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

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

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

答案

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
另一答案

也许在中间件中,您可以将请求传递给您的自定义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

以上是关于Django:如何扩展SessionBase以访问请求对象?的主要内容,如果未能解决你的问题,请参考以下文章

Django:扩展用户模型避免数据库连接

扩展 Django 1.11 用户模型

如何使用访问和刷新令牌返回自定义数据以识别 Django Rest Framework 简单 JWT 中的用户?

iOS如何访问私有文件以进行共享扩展

如何从 background.js 访问变量以在 chrome 扩展中弹出

Django 强制密码过期