Django 如何测试403错误?

Django 如何测试403错误?,django,unit-testing,http-status-code-403,http-error,Django,Unit Testing,Http Status Code 403,Http Error,我有一个测试类,它测试不同用户对所有页面的访问 这些访问由decorator在我的每个视图上定义 views.py: 有些装饰师是我定义的 decorators.py: def创建权限\必需(功能): @包装(功能) @需要登录 def装饰师(请求,*k,**a): user=get\u object\u或\u 404(user,username\uu iexact=request.user.username) 如果user.is_superuser或user.get_profile()。创建:

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

这些访问由decorator在我的每个视图上定义

views.py:

有些装饰师是我定义的

decorators.py:

def创建权限\必需(功能):
@包装(功能)
@需要登录
def装饰师(请求,*k,**a):
user=get\u object\u或\u 404(user,username\uu iexact=request.user.username)
如果user.is_superuser或user.get_profile()。创建:
返回函数(请求、*k、**a)
其他:

return HttpResponseRedirect(reverse(“non_autorise”))#如果需要403响应,如果使用Django 1.4,可以在decorator中引发异常。或者,您可以在decorator中返回一个。您还必须构建。

我遇到了同样的问题,并通过使用
follow=True
指示test get()遵循重定向来解决它。以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!!!
self.url\u创建中url的
:
r=c.get(反向(url['url'],args=url['args'],follow=True)

self.assertEqual(r.status_code,403)#或者我在这里遗漏了什么?事实上,问题确实来自使用HttpResponseRedirect()的装饰程序,但我不知道没有它如何做同样的事情。我尝试使用HttpResponseForbidden,但无法获得任何内容。我只是编辑我的帖子来解释你是想重定向到“非自动回复”视图,还是希望状态代码为302?你不能两者兼得,我不能?因为这正是我想要的: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 HttpResponseRedirect(reverse("non_autorise"))# <--- PROBLEM
    return decorateur
    return function
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 
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
self.assertEqual(r.status_code, 403)
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!!!