【问题标题】:Django: How to extend SessionBase to have access to the Request Object?Django:如何扩展 SessionBase 以访问请求对象?
【发布时间】:2012-11-16 22:52:55
【问题描述】:

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

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

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

我了解到使用上述答案(基本上将请求对象绑定到设置,因此您可以使用 import settings* 然后 settings.request 访问)是完全可怕的,也是最糟糕的方法。

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

【问题讨论】:

    标签: python django session request middleware


    【解决方案1】:

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

    稍后您可以以self.request 的身份访问request

    【讨论】:

    • 谢谢。这是一个更简洁的答案,但另一个首先出现。感谢您的帮助:)
    【解决方案2】:

    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
    

    【讨论】:

    • 谢谢。我以为我看到了一个错误,所以我尝试进行编辑,但是您输入的内容是正确的。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2012-01-28
    • 1970-01-01
    • 2020-11-04
    • 2016-11-08
    • 2011-11-15
    • 1970-01-01
    • 2017-05-28
    • 1970-01-01
    相关资源
    最近更新 更多