我有以下代码:
import sys
from zope.interface import implementer
from twisted.python import log
from twisted.internet import reactor
from twisted.web import server, resource, guard
from twisted.cred.portal import IRealm, Portal
from twisted.cred.checkers import InMemoryUsernamePasswordDatabaseDontUse
class GuardedResource(resource.Resource):
"""
A resource which is protected by guard and requires authentication in order
to access.
"""
def getChild(self, path, request):
return self
def render(self, request):
return "Authorized!"
@implementer(IRealm)
class SimpleRealm(object):
"""
A realm which gives out L{GuardedResource} instances for authenticated
users.
"""
def requestAvatar(self, avatarId, mind, *interfaces):
if resource.IResource in interfaces:
return resource.IResource, GuardedResource(), lambda: None
raise NotImplementedError()
def main():
log.startLogging(sys.stdout)
checkers = [InMemoryUsernamePasswordDatabaseDontUse(joe='blow')]
portal = Portal(SimpleRealm(), checkers)
resource = guard.HTTPAuthSessionWrapper(portal, [guard.BasicCredentialFactory('auth')])
reactor.listenTCP(8889, server.Site(resource = resource))
reactor.run()
if __name__ == '__main__':
main()
当我们启动服务器并访问URL时:
http://localhost:8889/
弹出提示,要求我们输入用户名和密码。输入user = joe
和password = blow
之后,我们仍然无权访问该网站。上面的代码有什么问题以及如何解决?
答案 0 :(得分:0)
因此,我按照@ Jean-Paul Calderone的建议在Trac上发帖,并解决了问题here
有2处需要解决的问题
def render(self, request):
return "Authorized!".encode('utf8')
InMemoryUsernamePasswordDatabaseDontUse
中的 checkers = [InMemoryUsernamePasswordDatabaseDontUse(joe=b'blow')]
因此,要让您的代码在py2和py3中运行,请使用此
from __future__ import print_function
import sys
from zope.interface import implementer
from twisted.python import log
from twisted.internet import reactor
from twisted.web import server, resource, guard
from twisted.cred.portal import IRealm, Portal
from twisted.cred.checkers import InMemoryUsernamePasswordDatabaseDontUse
class GuardedResource(resource.Resource):
"""
A resource which is protected by guard and requires authentication in order
to access.
"""
def getChild(self, path, request):
return self
def render(self, request):
return "Authorized!".encode('utf8')
@implementer(IRealm)
class SimpleRealm(object):
"""
A realm which gives out L{GuardedResource} instances for authenticated
users.
"""
def requestAvatar(self, avatarId, mind, *interfaces):
if resource.IResource in interfaces:
return resource.IResource, GuardedResource(), lambda: None
raise NotImplementedError()
def main():
log.startLogging(sys.stdout)
checkers = [InMemoryUsernamePasswordDatabaseDontUse(joe=b'blow')]
portal = Portal(SimpleRealm(), checkers)
resource = guard.HTTPAuthSessionWrapper(portal, [guard.BasicCredentialFactory('auth')])
reactor.listenTCP(8889, server.Site(resource = resource))
reactor.run()
if __name__ == '__main__':
main()