FTPRealm
erstellt FTPAnonymousShell
und FTPShell
Instanzen (Avatare), um den Zugriff auf das Dateisystem zu vermitteln.
Diese Klassen implementieren beide IFTPShell
. Eine Lösung besteht darin, einen Wrapper für FTPRealm
zu erstellen, der einen Logging-Wrapper auf die erstellten Avatare anwendet.
from twisted.python.components import proxyForInterface
class WrappingRealm(proxyForInterface(IRealm)):
wrap = staticmethod(logging_wrapper)
def requestAvatar(self, *a, **kw):
d = maybeDeferred(
super(WrappingRealm, self).requestAvatar,
*a, **kw
)
def got_avatar((iface, avatar, logout)):
return (iface, self.wrap(avatar), logout)
d.addCallback(got_avatar)
return d
Und implementieren logging_wrapper
so etwas wie:
class _LoggingFTPShell(proxyForInterface(IFTPShell)):
def makeDirectory(self, path):
log(avatar=self.avatar, operation="makeDirectory", path=path)
return super(_LoggingFTPShell, self).makeDirectory(path)
# The same for the rest of the methods of IFTPShell
# ...
def logging_wrapper(avatar):
return _LoggingFTPShell(avatar)
Dies ist ein bisschen langweilig, da Sie die Protokollierung auf der Schnittstelle für jede Methode hinzufügen müssen. Da die FTP-Protokollimplementierung von Twisted jedoch nativ keine Möglichkeiten bietet, die gewünschte Protokollierung durchzuführen, ist es schwierig, dies zu umgehen. Mit einigen Meta-Programmierung können Sie sich ein wenig Tipparbeit ersparen (aber auf Kosten einiger Komplexität).
würde Ein weiterer Ansatz ist ein Patch Twisted dazu beitragen, die Protokollierung Hinzufügen Sie interessiert sind.
Wird dieses Beispiel helfen? http://twistedmatrix.com/documents/current/_downloads/ftpclient.py – BoboDarph