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 Rest Framework 简单 JWT 中的用户?