当尝试访问需要用户登录的页面时,应将用户重定向到登录页面以输入其用户凭据。但是,在这种情况下进行测试时,我得到了 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}
)
答案 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将不加任何斜杠。
由于上述原因,这将导致测试失败。