我正在开发一个django项目,我需要阻止用户进入另一个视图
如果他在特定页面上。如果用户在另一页上,但他没有通过测试,他将被允许去任何地方。
例如,如果我有三个标签Tab1
,Tab2
和Tab3
。如果用户位于Tab2
且未通过测试A
,则他无法继续Tab1
和Tab3
。但如果他在Tab1
或Tab3
,但他没有通过该测试,他仍然可以转到Tab2
和Tab3
。
当用户点击Tab1
时,我想检查他是否在Tab2
。如果他不是,他将被允许去。但如果他在Tab2
,我将检查用户是否通过测试。如果他通过了考试,他将被允许离开。否则他将不被允许去。
我尝试使用@user_passes_test
装饰器,但它将用户作为参数,我无法获得当前的网址。有没有其他方法可以使用这个或任何其他我可以使用的装饰器?或者我必须编写自己的自定义装饰器?
答案 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/')