只能通过重定向和Django中的一个视图访问视图

时间:2016-10-02 15:11:53

标签: python django

如何使视图只能通过重定向和仅从特定的视图进行访问?

urls.py

#Assuming namespace = 'myApp'

url(r'^redarekt/$', views.redarekt, name='redarekt'),
url(r'^reciva/$', views.reciva, name='reciva'),

views.py

@login_required()
def redarekt(request):
    if request.user.is_authenticated() and request.user.is_active:
        return HttpResponseRedirect(reverse('myApp:reciva'))


@login_required()
def reciva(request):
    if request.user.is_authenticated() and request.user.is_active:
        #CHECK IF IT IS A REDIRECT AND COMING FROM redarekt
            execute(request)
        raise Http404
    raise Http404

如何让reciva只能通过重定向和仅redarekt来访问?

1 个答案:

答案 0 :(得分:2)

您可以使用request.session

@login_required()
def redarekt(request):
    if request.user.is_authenticated() and request.user.is_active:
        request.session['pp_redarekt'] = True
        return HttpResponseRedirect(reverse('myApp:reciva'))


@login_required()
def reciva(request):
    if request.user.is_authenticated() and request.user.is_active:
        if 'pp_redarekt' in request.session:
            execute(request)
            del request.session['pp_redarekt']
        raise Http404
    raise Http404

'pp_redarekt'代表上一页'redarekt'

所以基本上,在重定向到reciva(request)视图之前,您要设置添加会话密钥,即前一页是redarekt。当您在reciva视图中处理请求时,您正在删除该密钥,因此用户将无法输入reciva两次或更多次。

但是为此,您需要设置会话。 Guide and docs