Django @login_required装饰器不会重定向到特定页面

时间:2018-01-08 14:42:28

标签: django login-required

如果没有执行登录,我试图制作有限的用户编辑页面。

登录后,将打开编辑页面,其中包含网址中的任何user_id。

虽然只有user_id已登录用户才能打开编辑页面。

例如,我使用user_id = 7登录,因此只有一个下一个网址(http://127.0.0.1:8000/user/7/edit)必须有权访问编辑页面。

此编辑页面也可供任何下一个网址(http://127.0.0.1:8000/user/ /编辑)

使用

我的代码中是否有任何错误或错误?

我已经在Opera和Chrome中清除了缓存,但问题仍然存在。

Django ver。 1.11.9。

在settings.py

中未定义LOGIN_URL

urls.py

urlpatterns = [
    url(r'^login/$', user_login, name='user-login',),
    url(r'^(?P<user_id>\d+)/edit$', user_edit, name='user-edit',),
]

views.py

def user_login(request):
    login_form = AuthenticationForm(request.POST or None)

    if request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password']
        user = authenticate(request, username=username, password=password)
        if user:
            login(request, user)
            print("next is {}".format(request.GET.get('next')))
            return redirect(user_edit, user.id)
        else:
            return redirect(user_login)

    return render(request, 'user_login.html', {'form': login_form})


@login_required(login_url='/user/login/')
def user_edit(request, user_id):
    print(request, request.user)
    print("next is {}".format(request.GET.get('next')))
    return render(request, 'user_edit.html', {'userid': user_id, 'user': request.user})

1 个答案:

答案 0 :(得分:1)

login_required装饰器仅检查用户是否已登录。如果要检查登录用户是否可以访问对象,则需要在视图中执行此操作。例如:

from django.http import Http404

@login_required(login_url='/user/login/')
def user_edit(request, user_id):
    print(request, request.user)
    if request.user.id != user_id:
        raise Http404
    return render(request, 'user_edit.html', {'userid': user_id, 'user': request.user})