halvar.at bcom Python Tools Plone Zope Visual Basic Programmierung SW3 PC Computer Netzwerk Linux Windows Shop

Skip to content

Gerolds Homepage

Sections
Personal tools
You are here: Home Zope/Plone Anleitungen dir() auch für Zope
Document Actions

Den Python Befehl "dir()" in Zope nutzen

Beschreibt, wie ich den Python-Befehl "dir()" in Zope zur Ausgabe der Attribute eines Objektes verwende.

Es gibt ein paar Punkte die mich an Zope stören. Einer dieser Punkte ist, dass es keinen guten Überblick über die Attribute eines Objektes gibt.

In Python ist das recht einfach, man übergibt das zu analysierende Objekt an den Befehl dir() und bekommt die Attribute aufgelistet. Das ist leider in Zope aus Sicherheitsgründen deaktiviert. Das macht aber nichts, man kann sich diese Funktion aus Python ausleihen und wieder in Zope verfügbar machen.

Anleitung:

Erstellen einer Externen Funktion:

Da Zope diese Funktion nicht zur Verfügung stellt, muss man diese über eine externe Methode einbinden.

Erstelle im Dateisystem im Ordner INSTANCE_HOME/Extensions das Python-Modul zdir.py.

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-
"""

******************************************************************************
* Description:  Gibt den Befehl "dir" ins Zope als "zdir" zurueck
* Version:      0.4
* Created:      2004-08-23 by Gerold Penz - gerold.penz(at)aon.at
*
* 2004-08-26 Gerold
*    Verbesserung der Ausgabe
*
* 2005-03-21 Gerold
*    -  Ersetzen der Entities verbessert
*    -  __doc__-String der Ausgabe hinzugefuegt
*       Idee von Nico Grubert :-)
*    -  Ausgabe mit Tabellen formatiert
******************************************************************************
"""

import string


#----------------------------------------------------------
def _replace_entities(s):

   rlist = (
      (' & ',' & '),
      ('<', '&lt;'),
      ('>', '&gt;'),
      ('"', '&quot;'),
   )

   for item in rlist:
      s = s.replace(item[0], item[1])

   return s


#----------------------------------------------------------
def zdir(object):

   dlist = dir(object)
   dlist.sort()

   try:
      s = "<p><h2>Ergebnis von zdir(" + object.id + "):</h2></p>\n"

   except:
      s = "<p><h2>Ergebnis von zdir():</h2></p>\n"
   s += "<p>" + "<br>\n".join(dlist) + "</p>"

   try:
      s += "<p>&nbsp;</p><p><h2>Ergebnis der Abfrage des Wertes:</h2>\n %s</p>" % object
   except:
      pass

   s += "<p>&nbsp;</p><p><h2>Ergebnis der Abfrage einzelner Werte:</h2>\n</p>"

   myclass = "odd"
   for item in dlist:
      if myclass == "odd":
         myclass = "even"
      else:
         myclass = "odd"
         
      try:
         itemvalue = _replace_entities(str(getattr(object, item)))
         docstring = _replace_entities(str(getattr(object, item).__doc__))
         docstring = string.replace(docstring.strip(), "\n", "<br />\n")
         
         s1 = \
         """

         <div class="%s">
            <table border="0" cellspacing="0" cellpadding="2">
               <tr>

                  <td valign="top">
                     <b>%s:</b>
                  </td>
                  <td valign="top">
                     %s
                  </td>

               </tr>
         """ % (myclass, item, itemvalue)

         if docstring != "None":
            s2 = \
            """
               <tr>
                  <td valign="top">
                     <b>__doc__:</b>

                  </td>
                  <td valign="top">
                     %s
                  </td>
               </tr>
            """ % docstring
         else:
            s2 = ""

            
         s3 = \
         """
            </table>
         </div>
         """
         
         s = s + s1 + s2 + s3

      except:
         pass

   return  s

Diese Funktion muss ins Zope als "Externe Methode" eingebunden werden. Gehe dafür in den Root-Ordner (/) des ZMI (Zope Management Interface) und erstelle eine "Externe Methode" mit diesen Werten:

id:zdir
Module Name:zdir
Function Name:zdir

Die "Externe Methode" per PageTemplate verfügbar machen:

Die "Externe Methode" kann so nicht direkt aufgerufen werden, da keine Möglichkeit einprogrammiert wurde, den Kontext zu übergeben. Dieses Problem umgehe ich mit einem Page Template.

Erstelle im "Root-Ordner" ein Page Template mit dem Namen "zdir2".

<html xmlns="http://www.w3.org/1999/xhtml" 
[snip...]
   <span tal:replace="structure python:here.zdir(here)" />
[snip...]
</html>

Den ungekürzten Quellcode von zdir2 findest du hier.

Dieses Page Template ruft die Externe Methode auf und zeigt das Ergebnis an.

Verwenden von zdir2:

Wenn du die Attributes eines Objektes sehen möchtest, dann brauchst du nur im Browser an die URL des Objektes /zdir2 anhängen. Schon wird im Browser aufgelistet was dir() zu diesem Objekt zu sagen hat.

Sicherheitslücke:

Das Auflisten von Eigenschaften eines Objektes bietet Hackern natürlich einen wunderbaren Ansatzpunkt um in den Computer vorzudringen. Deshalb empfiehlt es sich, die Externe Methode zdir nur für Manager ausführbar zu machen.

In der Karteikarte "Security" müssen einfach alle Häckchen der Spalte Aquire permission settings? weg genommen werden.

 

Den Quellcode habe ich gepackt. Dieser kann hier heruntergeladen werden.

 

Powered by Plone   Powered by Bcom   Powered by Gentoo-Linux

Diese Seite erfüllt evt. :-) folgende Standards: