login_required 是一个常用的装饰器,在 Django 和其他一些 Python web 框架中使用,用于保护需要用户身份验证的视图函数,以确保只有已登录的用户才能访问这些视图。
该装饰器的基本工作原理是检查当前用户是否已经登录。如果用户已登录,则继续执行原始视图函数;否则,重定向到登录页面以进行身份验证。在 Django 中,登录页面可以是默认的 /admin/login/,也可以是开发者指定的任何其他视图函数。
下面是一个使用 login_required 装饰器的示例视图函数:
from django.contrib.auth.decorators import login_required
@login_required(login_url='login') # login_url 是用户未登录时重定向的页面
def my_view(request):
# 该视图需要用户登录才能访问
pass
该装饰器还有其他可选参数,例如 login_url 和 redirect_field_name,可以用来自定义登录页面的 URL 和重定向字段的名称。
如果直接访问:
http://127.0.0.1:8000/my_view
会重定向到:
http://127.0.0.1:8000/login/?next=/my_view
源码如下:
def login_required(
function=None, redirect_field_name=REDIRECT_FIELD_NAME, login_url=None
):
"""
Decorator for views that checks that the user is logged in, redirecting
to the log-in page if necessary.
"""
actual_decorator = user_passes_test(
lambda u: u.is_authenticated,
login_url=login_url,
redirect_field_name=redirect_field_name,
)
if function:
return actual_decorator(function)
return actual_decorator
lambda u: u.is_authenticated 中的 u.is_authenticated 是一个 User 模型的布尔属性,表示用户是否已经通过身份验证。在 Django 中,当用户成功登录后,系统会为该用户创建一个 User 实例,该实例中包含了用户的身份信息,包括用户名、密码等等。如果该用户已经通过身份验证,即已经登录,则其 is_authenticated 属性会被设置为 True。反之,如果该用户尚未通过身份验证,则其 is_authenticated 属性为 False。
因此,这个匿名函数的作用是检查传递给它的用户对象的 is_authenticated 属性是否为 True,如果是,则说明该用户已经通过身份验证,否则说明该用户尚未通过身份验证。如果用户已经通过身份验证,则可以访问需要登录的视图,否则将重定向到登录页面。
除了使用 @login_required 装饰器,Django 还提供了一种全局配置的方式来实现用户访问页面时自动跳转到登录页面。这可以通过设置 LOGIN_URL 参数来实现。
在 Django 项目的 settings.py 文件中,你可以定义 LOGIN_URL 参数,指定未登录用户访问需要登录的页面时应该重定向到的登录页面。示例:
# settings.py
# 设置登录页面的 URL
LOGIN_URL = '/accounts/login/'
上述代码中,假设你的登录页面 URL 是 /accounts/login/。当用户访问需要登录的页面但未登录时,Django 会自动将其重定向到 /accounts/login/ 页面。这种方式的优势在于你无需在每个需要登录的视图函数上都手动添加 @login_required 装饰器,而是通过全局设置来控制整个项目的登录重定向行为。