如果用户在特定网址上并且未通过测试,则阻止用户访问另一个视图

时间:2016-03-21 10:23:11

标签: python django decorator

我正在开发一个django项目,我需要阻止用户进入另一个视图

  1. 他正处于特定页面
  2. 未通过测试
  3. 如果他在特定页面上。如果用户在另一页上,但他没有通过测试,他将被允许去任何地方。

    例如,如果我有三个标签Tab1Tab2Tab3。如果用户位于Tab2且未通过测试A,则他无法继续Tab1Tab3。但如果他在Tab1Tab3,但他没有通过该测试,他仍然可以转到Tab2Tab3。 当用户点击Tab1时,我想检查他是否在Tab2。如果他不是,他将被允许去。但如果他在Tab2,我将检查用户是否通过测试。如果他通过了考试,他将被允许离开。否则他将不被允许去。

    我尝试使用@user_passes_test装饰器,但它将用户作为参数,我无法获得当前的网址。有没有其他方法可以使用这个或任何其他我可以使用的装饰器?或者我必须编写自己的自定义装饰器?

2 个答案:

答案 0 :(得分:2)

您可以通过创建中间件来解决它,
在中间件上,只需按request.META.get(' HTTP_REFERER',无)检查用户的转发URL。
如果db中存在用户尝试测试,则检查测试条目然后传递或返回错误页面或你想要的。

def process_response(self, request, response):
    referer_path = str(request.META.get('HTTP_REFERER',None))
    request_path = str(request.path)        
    match_pattern = r"[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}"

    if re.search(match_pattern, request_path) and request_path.__contains__('/lms/media/video/articulate/') and response.status_code == 200:
         #what you want logic

有关详细信息,请参阅https://docs.djangoproject.com/en/1.9/topics/http/middleware/

答案 1 :(得分:1)

下面是一个自定义装饰器,它以request个对象作为输入,我帮助检查当前位置并检查用户是否通过了特定测试。

from django.http import HttpResponseRedirect


def request_passes_test(test_func, redirect_url=None, message=None, status=401):
"""
Decorator for resources that checks that the request passes the given test.
If the request fails the test a 401 (Unauthorized) response is returned,
otherwise the view is executed normally. The test should be a callable that
takes an HttpRequest object and any number of positional and keyword
arguments as defined by the urlconf entry for the decorated resource.
"""
    def decorator(view_func):
        def _wrapped_view(request, *args, **kwargs):
            if not test_func(request, *args, **kwargs):
                return HttpResponseRedirect(redirect_url)
            return view_func(request, *args, **kwargs)
        return _wrapped_view
    return decorator

可以用作

@request_passes_test(test_function, redirect_url='/url/')