我有一个 web.py 应用程序,我正在本地通过 mod_wsgi (http://localhost/...) 运行。我已经到了为我的应用程序添加身份验证的地步,并想使用 web.py 的内置模块。我从这里找到的一个简短示例开始:http: //log.liminastudio.com/programming/howto-use-openid-with-web-py
import web, web.webopenid
urls = (
r'/openid', 'web.webopenid.host',
r'/', 'Index'
)
app = web.application(urls, globals())
class Index:
def GET(self):
body = '''
<html><head><title>Web.py OpenID Test</title></head>
<body>
%s
</body>
</html>
''' % (web.webopenid.form('/openid'))
return body
if __name__ == "__main__": app.run()
这在终端中运行并进入http://localhost:8080/运行良好。另一个示例http://c-farrell.blogspot.com/2010/11/usrbinenv-pythonimport-webfrom-web.html使用了类似的技术,但对我来说更有意义。
#!/usr/bin/env python
import web
from web import webopenid
urls = (
'/', 'index',
'/openid', 'webopenid.host',
)
... more code ...
class index:
def GET(self):
oid = webopenid.status()
if not oid:
return 'please log in: ' + \
webopenid.form('/openid')
else:
return 'you are logged in as:' + \
webopenid.form('/openid')
这是我有点迷路的地方。据我所知,传递给的参数form
是登录后的返回 URL。例如,如果我输入“http://www.yahoo.com/”,它会在每次登录尝试后将我带到那里。我觉得这应该指向我自己的控制器并在那里检查,但约定似乎是使用 web.webopenid.host 控制器,我猜它处理 id 并返回到基本的“/”url。我想我到了那里,但返回的状态总是None
.
从我收集的信息来看,这要么是代码问题,要么是我的 apache 配置中的某些东西使身份验证无法正常工作。在 web.webopenid 中,该库在与 Web 服务器相同的目录中创建一个 .openid_secret_key 文件。当我运行示例代码时,它会被创建。当我通过 apache 运行我的代码时,它不会(至少不在 cgi-bin 中。其他地方?)无论如何,如果这个文件不是每次都生成或重新生成,它将阻止我登录。我相信这是一个 apache 问题,因为我尝试通过 web.py 网络服务器运行我的应用程序,并且我确实创建了文件并且我可以进行身份验证。我能得出的结论是这个文件没有被写入,每个后续查询都会尝试一个新文件,我永远无法进行身份验证。