Ваше решение вдвойне неверно - 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)