我正在使用django(1.10)建立一个网站。我想限制未经授权的人(即未登录的用户)可以查看的页数。
理想的行为是,在访问N个不同页面后,用户将被定向到特定页面。
在我使用的其他网络平台(Symfony)中,有一种方法可以通过编写自定义“过滤器”和会话变量来实现这一点 - 我认为django通过它的 midleware 概念提供类似的功能。但是,不确定这是否可行,以实现此要求。
使用django框架,我如何才能最好地实现此要求(未经授权的用户在查看N个不同页面之后定向到自定义页面)?
答案 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/。