How to redirect to external URL in Django?
Asked Answered
E

2

33

I think this should be easy, but I cannot figure it out. I am trying to write an opt-out view. I am receiving a get request. Through urls.py, I render my opt-out view. In this view, I save some parameters for the user in the database and then I want to redirect the user to an external URL. I tried:

return redirect('http://stackoverflow.com/')

from Django documentation. However, the optout view renders the training template instead of returning the redirect, though the parameters are saved in the database as expected. My code is as follows:

def optout(request):
    if (('REMOTE_USER' in request.META and request.META['REMOTE_USER'] != "") or 
        (request.session.get('userid', False) and request.session['userid'] != "")):
        if ('REMOTE_USER' in request.META and request.META['REMOTE_USER'] != ""):
            userid = request.META['REMOTE_USER']
        if (request.session.get('userid', False) and request.session['userid'] != ""):
            userid = request.session['userid']
        user = User.objects.get(username=userid)
        user.optout = True
        user.postpone = False
        user.save()
        return redirect('http://stackoverflow.com/')
    context = { 'userid': "" }
    return render(request, 'games/Training.html', context)

Any help is highly appreciated.

Eosin answered 9/3, 2016 at 22:19 Comment(5)
What do you mean by it does not work? The optout view renders the Training template instead of returning the redirect?Fran
@JohnGordon, yes. You're right. The optout view renders the Training template instead of returning the redirect, though the parameters are saved in the database as expected.Eosin
similiar question is answered hereMonody
If it's rendering the Training template, then very likely your top if statement is evaluating to false (and thus redirect is never called). The database save must be happening elsewhere. Try putting in some logging statements.Fran
Did you import redirect? from django.shortcuts import redirectCreedon
U
38

Yeah, return redirect('http://stackoverflow.com/') is the correct method.

If you do the following, you can confirm that is a working method to redirect.

   from django.shortcuts import redirect

   def optout(request):
       return redirect("http://stackoverflow.com/")

Your conditional statements must not be catching.

Upstanding answered 9/3, 2016 at 22:22 Comment(5)
Yes Gator_Python. Thank you for your response. I checked the database for a number of times and both parameters are saved correctly.Eosin
So, what's happening instead of the expected redirect?Upstanding
The optout view renders the Training template instead of returning the redirect, though the parameters are saved in the database as expected.Eosin
Instead of checking your database, try printing out the conditionals you're checking for to see if they match what you expect. Or change that conditional to if True just for the sake of proving the return redirect portion is working. Then we can narrow our scope to figure out why those aren't catching, which is what I suspect is happening.Upstanding
Is there a way we could open the link on a new tab, as we do it in HTML using _blank?Cineaste
S
18

using class HttpResponseRedirect

from django.http import HttpResponseRedirect

def out(request):
    return HttpResponseRedirect("http://google.com")

Or:

using class HttpResponse

from django.http import HttpResponse

def out(request):
    response = HttpResponse("", status=302)
    response['Location'] = "scheme://host"
    return response

NOTE:

The last one is useful to redirect from a website to a mobile (Android/Iphone) app. Where location is scheme://host

Selfinduced answered 7/9, 2018 at 1:17 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.