是否有一个比装饰器更简洁的表示法,以便在任何视图函数之前调用一个函数

时间:2018-02-14 07:57:23

标签: python django django-views

我的所有视图函数都需要django请求对象来传递一些测试。是否有一个更短的符号,而不是

@request_passes_test(always_the_same_test)

在每个视图函数之上?

1 个答案:

答案 0 :(得分:0)

完成。我定义并注册了这个中间件类来执行passes_test检查。我从内置的@user_passes_test

中复制了一下
class RequestIsAuthorizedMiddleware:

  def __init__(self, get_response):
      self.get_response = get_response

  def __call__(self, request): 

      if always_the_same_test(request):
          return self.get_response(request)
      path = request.build_absolute_uri()
      resolved_login_url = resolve_url('/')
      login_scheme, login_netloc = urlparse(resolved_login_url)[:2]
      current_scheme, current_netloc = urlparse(path)[:2]
      if ((not login_scheme or login_scheme == current_scheme) and
              (not login_netloc or login_netloc == current_netloc)):
          path = request.META.get('HTTP_REFERER') or '/'
      return redirect(path)