AssertionError:301!= 200:无法获取重定向页面

时间:2019-12-25 22:33:45

标签: python django django-views

当尝试访问需要用户登录的页面时,应将用户重定向到登录页面以输入其用户凭据。但是,在这种情况下进行测试时,我得到了 AssertionError:301!= 200:无法检索重定向页面'/ accounts / sign_in'

我不清楚这是怎么回事?为什么我得到的是301而不是302?

class LoginRedirectRequest(TestCase):
    '''Verify that a user is redirected to
    a login page if they are not logged in.'''

    @classmethod
    def setUpTestData(cls):
        User.objects.create_user(
            username="testuser",
            password='*Dh&M3h36v*$J*'
        )

    def test_redirect_to_login_from_edit_profile_view(self):
        response = self.client.get(
            reverse("accounts:edit_profile", kwargs={'user_id': 1})
        )
        self.assertRedirects(response, '/accounts/sign_in/?next=/accounts/profile_edit/1/')
@login_required(login_url="/accounts/sign_in")
def edit_profile(request, user_id):
    user = request.user
    user_data = model_to_dict(
        user,
        fields=['username', 'first_name', 'last_name', 'email', 'verify_email']
    )
    current_profile = Profile.objects.get(user=user)
    profile_data = model_to_dict(
        current_profile, fields=['birth', 'bio', 'avatar']
    )
    if request.method == "POST":
        user_form = EditUserForm(
            request.POST, initial=user_data, instance=user
        )
        profile_form = ProfileForm(
            request.POST, request.FILES,
            initial=profile_data, instance=current_profile
        )
        if profile_form.is_valid() and user_form.is_valid():
            profile_form.save()
            user_form.save()
            if any(data.has_changed() for data in [profile_form, user_form]):
                messages.success(request, "Your profile is updated!")
            else:
                messages.success(request, "No profile changes applied...")
            return HttpResponseRedirect(
                reverse("accounts:profile", kwargs={'user_id': user_id})
            )
    else:
        profile_form = ProfileForm(initial=profile_data)
        user_form = EditUserForm(initial=user_data)
    return render(
        request, 'accounts/edit_profile.html',
        {'profile_form': profile_form,
            'user_form': user_form,
            'username': user}
    )

2 个答案:

答案 0 :(得分:1)

assertRedirects 方法的代码显示错误消息:

AssertionError: 301 != 200 : Couldn't retrieve redirection page '/accounts/sign_in'

显示在之后断言方法尝试跟随初始重定向到登录页面。它期望第二次调用的响应状态代码是 target_status_code 方法参数设置的任何值(默认为 200)。

您可以通过将 target_status_code 方法参数设置为 301 或设置参数 fetch_redirect_response=False 来停止断言错误,这将停止跟随初始重定向的尝试。

答案 1 :(得分:0)

注释中解释了302/301推理的原因,但测试首先失败的原因可能是因为您的LOGIN_URL路径缺少斜杠:

LOGIN_URL = '/account/login/'

由于没有默认斜杠APPEND_SLASH,因此django将不加任何斜杠。

由于上述原因,这将导致测试失败。