End of trace is:
File "C:\Python26\lib\site-packages\twisted\web\resource.py", line 189, in
render
raise UnsupportedMethod(getattr(self, 'allowedMethods', ()))
twisted.web.server.UnsupportedMethod: ()
On 11 February 2010 08:20, Brad Milne
Thanks. I had actually already found your page and you're right, it does seem to be the best resource out there. Since your email I've had a second look at it, as initially I wasn't sure how to use the example to return a web resource (handler with render_GET etc) in place of the file you returned. Turns out it wasn't actually too bad, and looks something like:
{code}
from zope.interface import implements
from twisted.cred.portal import IRealm, Portal from twisted.cred.checkers import FilePasswordDB from twisted.web.static import File from twisted.web.resource import IResource
from twisted.web.guard import HTTPAuthSessionWrapper, DigestCredentialFactory
def secureServer(): class PublicHTMLRealm(object): implements(IRealm)
def requestAvatar(self, avatarId, mind, *interfaces):
if IResource in interfaces: return (IResource, WebResource(), lambda: None) raise NotImplementedError()
portal = Portal(PublicHTMLRealm(), [FilePasswordDB('httpd.password')])
credentialFactory = BasicCredentialFactory("MyRealm") rsrc = HTTPAuthSessionWrapper(portal, [credentialFactory])
return rsrc
class WebResource(resource.Resource): def __init__():
....
def getChild(self, path, request): if path == self.expected: return ValidHandler() else: return InvalidUrlHandler()
# Create server my_server = secureServer(...)
site = server.Site(my_server)
{code}
This has worked great so far where ValidHandler contains a render_GET, but when calling a POST or PUT on handler that has render_POST or render_PUT using this technique returns a message which I think is Method Not Allowed (on the train right now, so don't have in front of me, sorry). Is there a better way to form the above to prevent this?
Thanks again Brad
On 9 February 2010 10:02,
wrote: ... It's definitely true that there isn't a lot of documentation for Guard.
I've written up something, though (which hopefully will soon be included in Twisted itself, to make it easier to find), which I think will get you up to speed on using Guard pretty quickly:
http://jcalderone.livejournal.com/53074.html
The final example, which sets up an actual Twisted Web server protected by digest auth (basic is even easier), only takes 16 lines.
If that's still not to your liking, then you can always fall back to the much more tedious, much less elegant, request.getUsername() and request.getPassword() approach. :) You'll have to rely on the API docs for that approach, though, as far as I know there are no prose-style introductions for it.
...
Jean-Paul
_______________________________________________ Twisted-Python mailing list Twisted-Python@twistedmatrix.com http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python