详解Django的 login_required() 函数:装饰器,限制未登录用户访问视图

  • Post category:Python

Django中的login_required()函数是一个装饰器,用于限制未经过身份验证的用户访问特定的视图函数。如果一个未登录的用户尝试访问一个被login_required()装饰的视图函数,Django则会将其重定向到登录页面,待其登录后才能访问该视图函数。

使用方法如下:

from django.contrib.auth.decorators import login_required

@login_required(login_url='/login/')
def my_view(request):
    # 只有登录用户才能访问此视图函数
    # 该函数的实际实现代码
    pass

其中,login_url参数是必须的,用于指定登录页面的URL。如果未指定,则默认重定向至/accounts/login/

下面给出两个实例:

  1. 基本使用:
# views.py
from django.shortcuts import render
from django.contrib.auth.decorators import login_required

@login_required(login_url='/login/')
def secret_page(request):
    context = {'message': '这里是仅对登录用户可见的页面!'}
    return render(request, 'secret.html', context)
<!-- templates/secret.html -->
{% extends 'base.html' %}

{% block content %}
  <h1>仅对登录用户可见的页面</h1>
  <p>{{ message }}</p>
{% endblock %}

当没有登录时,用户访问/secret/会被重定向至/login/;登录后再次访问/secret/可见。

  1. 重定向到原始页面:
# views.py
from django.shortcuts import render
from django.contrib.auth.decorators import login_required

@login_required(login_url='/login/')
def another_secret_page(request):
    context = {'message': '这里是仅对登录用户可见的页面!'}
    return render(request, 'secret.html', context)
<!-- templates/secret.html -->
{% extends 'base.html' %}

{% block content %}
  <h1>另外一个仅对登录用户可见的页面</h1>
  <p>{{ message }}</p>
{% endblock %}
# views.py
from django.shortcuts import redirect

@login_required(login_url='/login/')
def my_view(request):
    if not request.user.is_staff:
        # 如果该用户不是管理员,则重定向回原始页面
        return redirect(request.META.get('HTTP_REFERER', '/'))
    # 其他操作

在上面的代码中,如果当前用户不是管理员,则使用redirect()函数将其重定向回原始页面。request.META.get('HTTP_REFERER', '/')用于获取请求头的Referer字段,即请求来源页面的URL。如果该字段不存在,则重定向回根页面/