我正在设计一个网站。它处于非常早期阶段,我必须决定是否使用服务器提供的SingleSignOn服务。 (这是一个校园网站,越来越多的网站在这里使用SSO,所以一般来说这是一个好主意)。
目标平台很可能是通过mod_wsgi成为django。但是,此服务提供的任何文档都具有php代码。此方法严重依赖于使用自定义$_SERVER['HTTPsomething']
变量。不幸的是,现在我无法访问此环境。
(如何)我可以在django中访问这些自定义变量?根据{{3}}文档,environ变量应包含尽可能多的变量。我可以确定我可以访问它们吗?
答案 0 :(得分:5)
在Django中,服务器环境变量作为META
对象上request
属性的字典成员提供 - 因此在您的视图中,您始终可以通过request.META['foo']
访问它们。是变量的名称。
查看可用内容的简便方法是创建包含assert False
的视图以触发错误。只要您使用DEBUG=True
运行,您就会看到一个很好的错误页面,其中包含有关服务器状态的大量信息,包括所有request
属性的完整列表。
答案 1 :(得分: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 Basic和Digest身份验证设置这些变量,但是为了使用尽可能多的系统,SSO机制也应该使用它们。
如果设置了它们,则会出现一个Django功能,如下所述:
http://docs.djangoproject.com/en/dev/howto/auth-remote-user/
然后可以用来让Django接受更高级别的身份验证。
即使SSO机制不使用REMOTE_USER,而是使用自定义标头,您可以在整个Django应用程序周围使用自定义WSGI包装器将任何自定义标头转换为Django可以使用的合适的REMOTE_USER值。
答案 2 :(得分:0)
好吧,$ _SERVER是PHP。您可能也可以通过WSGI访问相同的变量,但是为了确保您需要确切了解SSO的工作原理,因此您知道是什么创建了这些变量(可能是Apache)并且您可以访问它们。 / p>
或者,您可以自己访问并试用它。 :)