Frage

Ich bin ein cherrypy App schreiben, und ich frage mich, was der beste Weg für die Strukturierung ist mein Handler und Code für größere Anwendungen?

Ich weiß, Zuordnung ist einfach Trog cherrypy.root, aber was sind einige Praktiken für die Handler zu schreiben und sie zuweisen?

(Erlauben Sie mir, meine Verwirrung zu beweisen!) Mein erster Gedanke ist es, eine Standard-Handler-Klasse zu schreiben, dass eine Vorlage folgert auf der aktuellen URL oder Klasse / Methodenkombination auf Basis zu laufen. Dann würde ich eine Instanz dieser Handler mehrmals auf den Pfad zuweisen Seiten zu erstellen. Ich sehe dies jedoch nicht arbeiten, da die rekursive Referenzen wären nicht ganz richtig funktionieren.

Also, angesichts der Tatsache, dass ich schon bin Zeichnung Rohlingen, wie meine eigenen Quellcode aussehen sollte, würde ich einige Hinweise und Beispiele lieben!

Fühlen Sie sich frei, einige detaillierte Fragen für mich zu fragen, zu klären. Zwar gibt es viele cherrypy Tutorial Material heraus ist, neigt sie dazu, nur an der Oberfläche zu kratzen.

War es hilfreich?

Lösung

Diese Frage wild subjektiv ist -. Aber ich werde ihm einen Schuss geben

  • Zunächst einmal halten immer Datenbank und Datencode an den Web-Code trennen. Was ich tue, ist viele kleine Dateien mit einer Klasse haben jeweils in einem DB/ Ordner, die alle zusammen in eine Base.py Datei verbunden sind, z:

    Web/
        Base.py - The main "base" class, which includes the classes in other 
                  web files, starts the web server in __init__
        Users.py - The class which includes methods generally from "DB/Users.py" 
                   which checks permissions etc before returning (you may 
                   wish to add DB-level security later though)
        ...
    DB/
        Base.py - The main base DB class, includes the other DB classes. Creates 
                  new SQLAlchemy/whatever instances and create database schemas if 
                  they don't etc. May pay to have database-wide methods
                  here to keep creating connections etc in one place if you 
                  decide to change databases later 
        Users.py - The user/password etc DB storage class file
        ...
    Templates/
        (HTML templates go here)
    Static/
        (Static images/CSS/javscript etc go here)
    
    Vergessen Sie nicht die __init__.py in jedem Modul Verzeichnis natürlich so Python, die Module in einem Unterverzeichnis

  • finden
  • Es muss nicht immer gleich, was Methoden, die Sie meiner Meinung nach für die Strukturierung von Code verwenden, aber konsistent sein. Ich schreibe ein Dokument mit all meinen Konventionen mit meinen Begründungen für sie verwenden und versuchen, sie es sinnvoll, auf den Punkt zu folgen, bis zu, aber wie immer a foolish consistency is the hobgoblin of small minds, wie unter Angabe den python-Stil docs : -)

  • Versuchen Sie Klassen zu verwenden, anstatt gerade Funktionen. Es ist vielleicht nicht für kleine Projekte Rolle, aber für irgendetwas nicht-triviale Dinge können schwierig werden. Es ist meine Präferenz viele Dateien mit einem bestimmten Zweck zu haben, und nur eine einzige Klasse in einer einzigen Datei, außer wo es Sinn macht mehrere

  • haben
  • Dies ist wahrscheinlich umstritten - ich in der Regel meine Klassen Class nennen und es nur von dem Modulnamen verweisen. Ich werde ein Beispiel für Base.py:
    import Users
    class Base(Users.Class):
        def __init__(self):
            Users.Class.__init__(self)
    
    geben Dies hilft, Probleme zu reduzieren, wenn andere Module aufeinander verweisen beim Import als from Users import Users Willen Konflikt, wenn Users.py from Base import x hat, damit ich immer Bezug von Modulnamen. Dies ist nur eine persönliche Vorliebe aber so tun, was Sie wollen :-P

Hoffentlich sollten Sie eine Vorstellung von diesem Posten allerdings erhalten.

Andere Tipps

CherryPy absichtlich es nicht erforderlich, von einer Rahmen versehene Basisklasse Unterklasse, so dass Sie frei sind, Ihren eigenen Vererbungsmechanismus zu entwerfen, oder, was noch wichtiger ist, die Verwendung gar keine. Sie sind sicherlich frei, Ihre eigene Basisklasse und vererben, sie zu definieren; Auf diese Weise können Sie Handler Konstruktion und Konfiguration über die __init__ Methode Ihrer Klasse und über Klasse-Ebene Variablen und Methoden.

standardisieren

Allerdings ist der bevorzugte Ansatz anders. Für die meisten Web-Anwendungen, die Sie nicht wollen wirklich die eigentliche Konstruktion Logik Ihrer Handler variieren, noch kümmern Sie viel über Klasse-Ebene Variablen oder Methoden; Stattdessen möchten Sie wiederverwendbare Variablen und Methoden per URI oder pro Teilstruktur von URIs oder pro Standort, nicht pro Klasse. Sie neigen dazu, einen Satz von Behandlungsroutinen von einem anderen Satz von mehr Instanz Konfiguration (handler Metadaten) und Instanzmethoden (handler logic) zu variieren. Traditionelle klassenbasierte Vererbung kann dies tun, aber es ist ein bisschen wie ein stumpfes Instrument für diese Art der Anpassung.

CherryPy, daher wird, entwickelt, um diese Art der Anpassung pro-Ressource-Set zur Verfügung zu stellen, dass klassenbasierte Vererbung nicht gut tun. Es stellt dies durch 1) das Design seines Konfigurationssystem, mit dem Ihnen Metadaten zu einem einzelnen URI, eine Teilstruktur von URIs, ein Teilbaum der Handler oder einer ganzen Seite mit der gleichen Syntax binden kann ( finden Sie unter http://docs.cherrypy.org/dev/intro/concepts/config. html für eine Übersicht), und 2) System des Haken und Tools, die Sie binden kann Logik zu einem einzelnen URI, eine Teilstruktur von URIs, ein Teilbaum der Handler, oder einem ganzen Seite? ?. Siehe http://docs.cherrypy.org/dev/intro/concepts/tools. html

So, praktisch: Verwenden Sie normale Attribute auf cherrypy.root Ihren Baum von Handler zu erstellen:

def make_app():
    root = Root()
    root.foo = Foo()
    root.bars = BarCollection()
    return root

Jedoch nicht Wurzel machen, Foo und Bar erben von einer gemeinsamen Basisklasse. Stattdessen schreibt unabhängige Werkzeuge, Dinge zu tun wie „infer Vorlagen“. Das heißt, statt:

from cherrypy import expose

class Foo(MyAppBase):
    @expose()
    def index(self, a, b, c):
        ...

root.foo = Foo(template='foo.html')

write:

from cherrypy import expose, tools

class Foo(object):
    @tools.render(template='foo.html')
    @expose()
    def index(self, a, b, c):
        ...

root.foo = Foo()

... wo ‚tools.render‘ ist ein CherryPy Werkzeug, das Sie geschrieben haben, zu sehen und die gegebene Vorlage anwenden. Dieser Ansatz ermöglicht es Ihnen, die Argumente das Tool in Ihrer Konfigurationsdatei außer Kraft zu setzen und vermeiden umpacken oder Patch Code mit:

[/foo/]
tools.render.template = 'foo2.html'
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top