我有一个自定义会话类,我已经构建了扩展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
。