0

我有一个测试类,用于测试不同用户对所有页面的访问。

这些访问权限是由装饰器在我的每个视图上定义的。

视图.py:

@login_required
def afficher(request):
    ...
    ...

@creation_permission_required
def ajouter(request):
    ...
    ...

其中一些装饰器是由我定义的。

装饰器.py:

def creation_permission_required(function):
    @wraps(function)
    @login_required
    def decorateur(request, *k, **a):
        user = get_object_or_404(User, username__iexact=request.user.username)
        if user.is_superuser or user.get_profile().creation:
            return function(request, *k, **a)
        else:
            return HttpResponseRedirect(reverse("non_autorise"))# <--- PROBLEM
    return decorateur
    return function

当我测试它们时,我使用 status_code 属性来验证用户是否可以访问该页面

测试.py:

c = Client()
c.login(username='aucun', password='aucun')
for url in self.url_aucun:
    r = c.get(reverse(url['url'], args=url['args']))
    self.assertEqual(r.status_code, 200)
for url in self.url_creation:
    r = c.get(reverse(url['url'], args=url['args']))
    self.assertEqual(r.status_code, 302)      # <--- SECOND PROBLEM 

当用户无权访问某个页面时,该页面应返回 403 错误(禁止访问)。如何测试 403 而不是 302 ?

编辑:我尝试使用 HttpResponseForbidden(reverse("non_autorise")),但无法获得任何内容。因此,我尝试制作自己的 HttpResponse ,它是 HttpResponseRedirect 的精确副本,但使用另一个 status_code (403)仍然没有得到任何内容......

装饰器.py:

class HttpResponseTest(HttpResponse):
    def __init__(self, redirect_to):
        super(HttpResponseTest, self).__init__()
        self['Location'] = iri_to_uri(redirect_to)
        self.status_code = 403

def creation_permission_required(function):
    @wraps(function)
    @login_required
    def decorateur(request, *k, **a):
        user = get_object_or_404(User, username__iexact=request.user.username)
        if user.is_superuser or user.get_profile().creation:
            return function(request, *k, **a)
        else:
            return HttpResponseTest(reverse("non_autorise"))# <--- PROBLEM
    return decorateur
    return function
4

3 回答 3

1

如果你想要一个 403 响应,如果你使用的是 Django 1.4,你可以在你的装饰器中引发PermissionDenied异常。或者,您可以在装饰器中返回HttpResponseForbidden。您还必须构建一个自定义 login_required 装饰器

于 2012-07-03T09:41:58.567 回答
0
self.assertEqual(r.status_code, 403)
于 2012-07-03T09:12:00.317 回答
0

我遇到了同样的问题,并通过指示测试 get() 使用follow=True. 使用 BlueMagma 的示例,它看起来像这样:

for url in self.url_creation:
    r = c.get(reverse(url['url'], args=url['args']), follow=True)
    self.assertEqual(r.status_code, 403)      # <--- SECOND PROBLEM NO MORE!!!

希望这对其他人有帮助!

于 2013-06-06T21:03:12.217 回答