URL перенаправления в Python - PullRequest
0 голосов
/ 25 июня 2018

Я уже несколько дней ломаю голову над этим, вот сценарий.

Я написал класс для нашей internal sso проверки. Когда мое Django приложение загружается, я вызываю функцию, чтобы проверить, является ли пользователь sso действительным или нет, если нет, страница должна перенаправить на страницу входа sso.

import webbrowser
@csrf_exempt
def Sso(request):
    #Initializing the sso class 
    ssoObj = sso(True)
    applicationURL = 'http://app.com'
    if not(ssoObj._isValidUser):
        redirectionUrl = ssoObj.GetRedirectionUrl(applicationURL)
        webbrowser.open(redirectionUrl)
    return HttpResponse("reached last line")

Примечание: по умолчанию ssoObj._isValidUser вернет False. ssoObj.GetRedirectionUrl функция вернет SSO URL + "return=" + applicationURL.

Когда веб-браузер удаляется, он открывает перенаправленную ссылку Mozilla (возможно, это мой браузер по умолчанию, не уверен). Я хочу, чтобы URL-адрес перенаправления открывался на той же вкладке, когда пользователь обращается к URL-адресу приложения. Как мне это сделать? Любые предложения приветствуются.

1 Ответ

0 голосов
/ 25 июня 2018

Ваше решение вдвойне неверно - webbrowser.open(...) пытается запустить браузер в системе, в которой работает ваш код, поэтому у вас не только будет неправильное поведение при локальном запуске приложения django, но также произойдет полный сбой в работе, поскольку он попытается открыть браузер на узле server - и либо потерпит неудачу с исключением, если в вашей серверной системе не настроен браузер, либо, что еще хуже, просто зависнет, пока браузер не закроется (что никогда не будет произойдет, потому что некому будет его закрыть ...) или процесс перезапустится.

Надлежащим решением здесь является возврат ответа с кодом состояния перенаправления и URL-адресом для перенаправления. У Django есть и HttpResponseRedirect объект и еще более простая redirect() функция быстрого доступа , поэтому технически ваш код должен выглядеть следующим образом:

from django.shortcuts import redirect

@csrf_exempt
def Sso(request):
    #Initializing the sso class 
    ssoObj = sso(True)
    applicationURL = 'http://app.com'
    if not(ssoObj._isValidUser):
        redirectionUrl = ssoObj.GetRedirectionUrl(applicationURL)
        return redirect(redirectionUrl)
    return HttpResponse("reached last line")

Теперь пара предостережений, примечаний и т. Д .:

1 / Ваши имена классов должны быть в CamelCased.

Ваш класс 'sso' должен называться Sso - или SSOBackend или что-то подобное - не sso

2 / имена ваших функций должны быть all_lower.

Ваше представление Sso должно называться sso - но на самом деле оно должно, вероятно, называться в соответствии с тем, что оно на самом деле делает, то есть проверять, прошел ли ваш пользователь аутентификацию на вашем сервере единого входа, и перенаправлять его, если не

3 / Ваши имена переменных и атрибутов также должны быть all_lower.

ssoObj => sso_obj

applicationURL => application_url

GetRedirectionUrl => get_redirection_url

_isValidUser => _is_valid_user

3 / начальное подчеркивание обозначает закрытый атрибут

Так что либо _is_valid_user следует сделать общедоступным, переименовав его в is_valid_user, либо у класса есть какой-то другой публичный способ предоставить вам эту информацию и которую вы должны использовать.

И последнее, но не менее важное: совсем наоборот:

4 / Вы должны использовать django.contrib.auth функции и предоставить свой собственный бэкэнд аутентификации вместо того, чтобы изобретать пресловутое SquaredWheel (tm)

...