Yax
Yax

Reputation: 2189

Make view accessible only through redirect and from only one view in Django

How do I make a view to be only accessible through redirect and from a only a particular view?

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

How do I make reciva to be only accessible through redirect and from a only redarekt?

Upvotes: 2

Views: 2311

Answers (1)

vishes_shell
vishes_shell

Reputation: 23484

You can use 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' stands for Previous Page 'redarekt'

So basically, before redirecting to reciva(request) view you're setting adding session key, that says that previous page was redarekt. When you handle your request in reciva view, you are deleting that key, so user won't be able to enter reciva twice or more.

But for doing so, you need to setup your sessions. Guide and docs

Upvotes: 7

Related Questions