ajax 视图上的 login_required 装饰器返回 401 而不是 302

djangoAjax

1个回答

写回答

彭彭彭杉

2025-06-22 15:40

+ 关注

Ajax
Ajax

使用 Ajax 视图时,经常需要对用户进行认证,以确保只有已登录用户才能访问特定页面或执行特定操作。在 Django 中,可以使用 login_required 装饰器来实现这一功能。

login_required 装饰器的默认行为是,如果用户未登录,将会重定向到登录页面,并返回状态码 302。然而,有时候我们希望在 Ajax 视图中返回一个不同的状态码,例如 401 Unauthorized,以便在前端进行相应的处理。

为了实现这个需求,我们可以自定义一个 Ajax_login_required 装饰器,该装饰器将在用户未登录时返回状态码 401。

下面是一个案例代码,演示了如何实现这个自定义装饰器:

Python

from Django.http import HttpResponseUnauthorized

from Django.contrib.auth.decorators import login_required

from functools import wraps

def Ajax_login_required(view_func):

@wraps(view_func)

def wrapper(request, *args, <strong>kwargs):

if not request.user.is_authenticated:

return HttpResponseUnauthorized()

return view_func(request, *args, </strong>kwargs)

return wrapper

@login_required

def my_Ajax_view(request):

# 处理 Ajax 请求的视图函数

# ...

@Ajax_login_required

def my_Ajax_view(request):

# 处理 Ajax 请求的视图函数,返回 401 未授权状态码

# ...

在上面的代码中,我们首先导入了 HttpResponseUnauthorized 类和 login_required 装饰器。然后,我们使用 functools 模块的 wraps 装饰器,确保返回的函数具有原始视图函数的名称和文档字符串。

接下来,我们定义了 Ajax_login_required 装饰器函数,它接受一个视图函数作为参数。在装饰器内部,我们检查用户是否已经通过身份验证,如果没有,则返回 HttpResponseUnauthorized 对象,该对象表示 401 未授权状态码。如果用户已登录,则调用原始的视图函数,并将其返回值作为结果返回。

最后,我们使用 @Ajax_login_required 装饰器来修饰 Ajax 视图函数,以确保只有已登录用户才能访问该视图。

自定义 Ajax 登录认证装饰器实例

在这个案例中,我们假设有一个需要登录才能访问的 Ajax 视图函数 get_user_profile,该函数用于获取用户的个人资料信息。我们希望在用户未登录时返回状态码 401,以便在前端进行相应的处理。

Python

from Django.http import HttpResponse, HttpResponseUnauthorized

from Django.contrib.auth.decorators import login_required

from functools import wraps

def Ajax_login_required(view_func):

@wraps(view_func)

def wrapper(request, *args, <strong>kwargs):

if not request.user.is_authenticated:

return HttpResponseUnauthorized()

return view_func(request, *args, </strong>kwargs)

return wrapper

@Ajax_login_required

def get_user_profile(request):

# 处理 Ajax 请求的视图函数

# ...

return HttpResponse('User profile data')

在上面的代码中,我们定义了一个名为 get_user_profile 的视图函数,并使用 @Ajax_login_required 装饰器修饰,以确保只有已登录用户才能访问该视图。

当用户未登录时,Ajax 请求该视图函数时,将返回一个具有 401 未授权状态码的响应。而当用户已登录时,将执行视图函数的逻辑,并返回一个包含用户个人资料数据的响应。

通过自定义 Ajax_login_required 装饰器,我们可以在 Ajax 视图中返回 401 而不是默认的 302 重定向,从而更好地满足前端的需求。这样前端可以根据不同的状态码来进行相应的处理,例如显示登录弹窗或提示用户进行登录操作。

在使用 Ajax 视图时,我们经常需要对用户进行认证,以确保只有已登录用户才能访问特定页面或执行特定操作。Django 提供了 login_required 装饰器来实现这一功能,但默认返回的是状态码 302 重定向。

为了在 Ajax 视图中返回 401 未授权状态码而不是 302 重定向,我们可以自定义一个 Ajax_login_required 装饰器。该装饰器通过检查用户是否已登录,并根据情况返回不同的响应对象,以实现我们的需求。

通过自定义装饰器,我们可以更好地控制 Ajax 视图的行为,使其返回符合前端需求的状态码,从而提升用户体验和前后端的协作效率。

举报有用(4分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号