$_SERVER 与 WSGI 环境参数

2 投票
3 回答
3933 浏览
提问于 2025-04-15 13:00

我正在设计一个网站。现在还处于非常早期的阶段,我需要决定是否使用服务器提供的单点登录(SingleSignOn,简称SSO)服务。这个网站是校园网站,越来越多的地方开始使用SSO,所以一般来说这是个不错的选择。

我打算使用django通过mod_wsgi来搭建这个平台。不过,关于这个服务的文档里大多是php代码。这种方法主要依赖于使用自定义的 $_SERVER['HTTPsomething'] 变量。不幸的是,我现在无法访问这个环境。

我该如何在django中访问这些自定义变量呢?根据WSGI的文档,环境变量应该包含尽可能多的变量。我能确定我能访问到这些变量吗?

3 个回答

0

好吧,$_SERVER 是 PHP 里的一个东西。你可能也能通过 WSGI 访问到相同的变量,但为了确保这一点,你需要搞清楚单点登录(SSO)是怎么工作的,这样你才能知道这些变量是由什么创建的(可能是 Apache),并且你能否访问它们。

或者,你可以自己获取访问权限,试试看。:)

3

为了查看在原始 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()]

这样做会把一组键值对显示回浏览器。

了解单点登录(SSO)机制是很重要的。如果这个机制工作正常,你可能会发现它设置了 REMOTE_USER 和可能的 AUTH_TYPE 变量。如果 REMOTE_USER 被设置了,这就说明这个变量里提到的用户已经通过 Apache 的某种更高级的认证机制进行了认证。通常情况下,这些变量是为 HTTP 基本认证和摘要认证设置的,但为了兼容更多的系统,单点登录机制也应该使用这些变量。

如果这些变量被设置了,Django 有一个功能可以使用,具体描述在这里:

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

这个功能可以让 Django 接受更高级别的认证。

即使单点登录机制没有使用 REMOTE_USER,而是使用自定义的头信息,你也可以在整个 Django 应用程序周围使用一个自定义的 WSGI 包装器,把任何自定义的头信息转换成 Django 可以使用的合适的 REMOTE_USER 值。

6

在Django中,服务器的环境变量可以通过请求对象中的META属性来获取,这些变量就像字典里的成员一样。所以在你的视图函数里,你可以通过request.META['foo']来访问这些变量,其中foo是你想要的变量名。

想要查看有哪些可用的变量,一个简单的方法是创建一个视图,里面写上assert False来故意触发一个错误。只要你把DEBUG设置为True,你就会看到一个漂亮的错误页面,上面有很多关于服务器状态的信息,包括所有request属性的完整列表。

撰写回答