Was sind einige bewährte Methoden zur Strukturierung cherrypy apps?
-
27-09-2019 - |
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.
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 eineBase.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
Vergessen Sie nicht die__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)__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
- 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:
geben Dies hilft, Probleme zu reduzieren, wenn andere Module aufeinander verweisen beim Import alsimport Users class Base(Users.Class): def
__init__
(self): Users.Class.__init__
(self)from Users import Users
Willen Konflikt, wennUsers.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.
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'