Django:如何从会话创建中排除视图?

问题描述 投票:1回答:1

我的Django项目在很大程度上依赖于会话,而Framework在此方面做得很好。它管理会话Cookie,会话数据库等,大部分通过SessionMiddleware完成。

但是有些视图明确不需要会话。这些视图通常显示为页面的条目。

我可以从创建新会话的SessionMiddleware中排除这些视图吗?如果新的(匿名)用户访问了此类视图并离开,则无需在会话表中设置Cookie或创建数据库记录。

django django-views django-sessions
1个回答
0
投票

我采用了“自适应中间件”的方式,因为看起来会话是仅在访问会话时创建的,或者(如果是全新的会话,则是在SessionMiddleware中处理响应期间创建的。)>

所以我创建了这个中间件,扩展了SessionMiddleware

from django.contrib.sessions.middleware import SessionMiddleware
from django.http import HttpRequest


class ConditionalSessionMiddleware(SessionMiddleware):

    def process_request(self, request: HttpRequest):
        # Default: We need a Session
        setattr(request, '_conditional_session_middleware_session_required', True)
        return super(ConditionalSessionMiddleware, self).process_request(request)

    def process_response(self, request: HttpRequest, response):
        # Is still a Session required?
        required = getattr(request, '_conditional_session_middleware_session_required', True)
        # or is the user not anonymous?
        if required or not request.user.is_anonymous:
            return super(ConditionalSessionMiddleware, self).process_response(request, response)
        else:
            return response

要使用它,我创建了一个简单的函数装饰器:

from types import MethodType


class NoSessionUsed(object):

    def __init__(self, f):
        self.__func = f

    def __call__(self, instance, request: HttpRequest, *args, **kwargs):
        # Mark request that we don't need a session
        setattr(request, '_conditional_session_middleware_session_required', False)
        func_return = self.__func(instance, request, *args, **kwargs)
        return func_return

    def __get__(self, instance, owner):
        if instance:
            return MethodType(self, instance)
        else:
            return self

在基于类的视图中,我在dispatch方法上使用装饰器:

@NoSessionUsed
def dispatch(self, request, *args, **kwargs):
    return super(ShortLinkView, self).dispatch(request, *args, **kwargs)

当然有缺点:

  • 当我在装饰视图中使用会话时,很可能不会保存更改
  • 当我在装饰视图中使用新会话时,用户将不会获得会话Cookie
  • 这可能不是完美的解决方案,但是它很简单,对我有用。

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