Параметр окружения $ _SERVER vs. WSGI - PullRequest
1 голос
/ 19 июля 2009

Я разрабатываю сайт. Это на очень ранней стадии, и я должен принять решение, использовать ли службу SingleSignOn, предоставляемую сервером, или нет. (это сайт кампуса, и все больше и больше сайтов используют SSO здесь, так что в целом это хорошая идея). Скорее всего, целевой платформой будет django через mod_wsgi. Однако любая документация, предоставляемая с этим сервисом, содержит код php. Этот метод в значительной степени основан на использовании пользовательских $_SERVER['HTTPsomething'] переменных. К сожалению, сейчас у меня нет доступа к этой среде.

(Как) я могу получить доступ к этим пользовательским переменным в Django? Согласно документации WSGI , переменная окружения должна содержать как можно больше переменных. Могу ли я быть уверен, что смогу получить к ним доступ?

Ответы [ 3 ]

5 голосов
/ 19 июля 2009

В Django переменные среды сервера предоставляются в виде словарных элементов атрибута META объекта request - так что, по вашему мнению, вы всегда можете получить к ним доступ через request.META['foo'], где foo - имя переменной .

Простой способ увидеть, что доступно, - это создать представление, содержащее assert False, чтобы вызвать ошибку. Пока вы используете DEBUG=True, вы увидите красивую страницу с ошибкой, содержащую много информации о состоянии сервера, включая полный список всех атрибутов request.

3 голосов
/ 20 июля 2009

Чтобы определить набор переменных, передаваемых в необработанной среде WSGI, перед тем, как Django что-либо с ними сделает, поместите следующий код в файл сценария WSGI вместо содержимого Django.

import StringIO

def application(environ, start_response):
    headers = []
    headers.append(('Content-type', 'text/plain'))

    start_response('200 OK', headers)

    input = environ['wsgi.input']
    output = StringIO.StringIO()

    keys = environ.keys()
    keys.sort()
    for key in keys:
        print >> output, '%s: %s' % (key, repr(environ[key]))
    print >> output

    length = int(environ.get('CONTENT_LENGTH', '0'))
    output.write(input.read(length))

    return [output.getvalue()]

Он отобразит обратно в браузер набор пар ключ / значение.

Важно выяснить, как работает механизм единого входа. Если он делает разумную вещь, вы, возможно, обнаружите, что он устанавливает переменные REMOTE_USER и, возможно, AUTH_TYPE. Если установлен REMOTE_USER, это показатель того, что имя пользователя в переменной было аутентифицировано каким-либо механизмом аутентификации более высокого уровня в Apache. Эти переменные обычно устанавливаются для HTTP Basic и дайджест-аутентификации, но для работы с максимально возможным числом систем механизм SSO также должен их использовать.

Если они установлены, то есть функция Django, описанная в:

http://docs.djangoproject.com/en/dev/howto/auth-remote-user/

, который затем можно использовать для принятия аутентификации Django на более высоком уровне.

Даже если механизм единого входа не использует REMOTE_USER, а вместо этого использует пользовательские заголовки, вы можете использовать пользовательскую оболочку WSGI для всего приложения Django, чтобы преобразовать любые пользовательские заголовки в подходящее значение REMOTE_USER, которое Django может затем использовать.

0 голосов
/ 19 июля 2009

Ну, $ _SERVER - это PHP. Скорее всего, вы сможете получить доступ к тем же переменным через WSGI, но чтобы быть уверенным, вам необходимо точно определить, как работает SSO, чтобы вы знали, что создает эти переменные (возможно, Apache) и что вы можете получить к ним доступ.

Или вы можете получить доступ и попробовать его. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...