django - 如何限制未经身份验证的用户可以查看的页数

时间:2017-07-06 08:22:23

标签: django

我正在使用django(1.10)建立一个网站。我想限制未经授权的人(即未登录的用户)可以查看的页数。

理想的行为是,在访问N个不同页面后,用户将被定向到特定页面。

在我使用的其他网络平台(Symfony)中,有一种方法可以通过编写自定义“过滤器”和会话变量来实现这一点 - 我认为django通过它的 midleware 概念提供类似的功能。但是,不确定这是否可行,以实现此要求。

使用django框架,我如何才能最好地实现此要求(未经授权的用户在查看N个不同页面之后定向到自定义页面)?

2 个答案:

答案 0 :(得分:2)

类似的东西:

if has_attr(request, 'page_count'):
    request.page_count += 1
else:
    request.page_count = 1

docs如何实施middleware

def simple_middleware(get_response):
# One-time configuration and initialization.

def middleware(request):
    # Code to be executed for each request before
    # the view (and later middleware) are called.

    response = get_response(request)

    # Code to be executed for each request/response after
    # the view is called.

    return response

return middleware

或者:

class SimpleMiddleware(object):
    def __init__(self, get_response):
        self.get_response = get_response
        # One-time configuration and initialization.

    def __call__(self, request):
        # Code to be executed for each request before
        # the view (and later middleware) are called.

        response = self.get_response(request)

        # Code to be executed for each request/response after
        # the view is called.

        return response

编辑: 如果您正在使用class实现它:

def process_request(self, request):
    if request.page_count >= <count>:
        return redirect(<your redirect here>)

答案 1 :(得分:0)

是的,中间件是正确的地方。中间件在每个请求上运行,它可以访问当前请求和会话,如果中间件在SessionMiddleware和AuthenticationMiddleware之后运行(取决于MIDDLEWARE_CLASSES设置中的顺序),则可以访问用户对象。

您可以保存设置上显示的页数,如果超过限制,则从中间件返回HttpResponseRedirect。

当然,用户可以随时丢弃他的会话cookie或启动一个无法帮助的隐身浏览器标签。

请参阅中间件文档:https://docs.djangoproject.com/en/1.11/topics/http/middleware/