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/
。
下面给出两个实例:
- 基本使用:
# 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/
可见。
- 重定向到原始页面:
# 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。如果该字段不存在,则重定向回根页面/
。