使视图只能通过重定向访问,并且只能从 Django 中的一个视图访问

Yax*_*Yax 1 python django

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

网址.py

#Assuming namespace = 'myApp'

url(r'^redarekt/$', views.redarekt, name='redarekt'),
url(r'^reciva/$', views.reciva, name='reciva'),
Run Code Online (Sandbox Code Playgroud)

视图.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
Run Code Online (Sandbox Code Playgroud)

如何使reciva只能通过重定向和来自 a only 访问redarekt

vis*_*ell 5

您可以使用 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
Run Code Online (Sandbox Code Playgroud)

'pp_redarekt' 代表上一页 'redarekt'

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

但为此,您需要设置会话。指南和文档