pyMFrame
Ein WEB Framework in Python
Autor: W.Nagy
Navigieren in dieser Präsentation durch Pfeiltasten
↑ vorherige Seite, ↓ Folgeseite.
Diese Präsentation ist erstellt mit
S5
Restriktion
Dieses Dokument enthält Rechtschreibfehler.
Der Finder darf diese zu privaten Zwecken vervielfältigen, verändern oder sonst wie gebrauchen.
Der Autor behält aber dabei alle Rechte. Eine kommerzielle Verwendung bedarf der ausdrücklichen schriftlichen Zustimmung des Autors.
Sollte trotz sorgfältiger Bearbeitung keine Rechtschreibfehler enthalten sein,
so bitten der Autor um schriftliche Verständigung (microframework@gmail.com), dieser wird ehebaldigst einen korrekten Zustand wieder herstellen.
Meine Motivation das Framework zu entwicklen
- Ich wollte Python lernen
- Ich schreibe gerne Frameworks
- Ich wollte gerne ein auf meine persönlichen Bedürfnisse angepasstes System haben
- Ich habe schnell ein System gebraucht, welches eine kurze Lebensdauer hatte
- Es macht Spass :-)
Hintergrund
pyMFrame ist ein Webframework in der Sprache Python.
Das original
mFrame wurde in groovy entwickelt.
pyMFrame ist eine Portierung des Originals in Python.
Es wurden ca. 70% des Funktionsumfangs portiert.
Kenndaten
- Menü
- Kennwortschutz
Rechte/Rollen
- Templates
- MVC Modell
- Taglib
- Optionale Datenbankanbindung
derzeitig sqlite3
- Viewer mit eingebetten Pythoncode
- Typensichere Domains
Hintergrund - 2
Das Framework ist
nicht als Konkurenz zu bestehenden Frameworks gedacht.
Warum nicht Django, etc.
Das Framework dient hauptsächlich zu Test und Schulungszwecken.
- Einfache Änderungen im Kode
- Klein und Übersichtlich
- Großteils unabhängige Klassen
Einsatz als/für...
- Kleinprojekte
- Websites welche Passwortschutz aber keine aktiven Inhalte haben
- Kodebaukasten
- Rapid Prototyping
Architektur
Verzeichnisstruktur
Das Framework setzt eine Verzeichnisstruktur voraus.
Diese Verzeichnisstuktur kann durch Anpassungen in der Konfiguration geändert werden.
Konfiguration
Im Skript start.py werden die Pfade auf die Bibliotheken gesetzt.
In der Klasse applib/WEB-INF/conf/config.py
könnnen die Pfade auf die Verzeichnisse welche nicht über ein URL erreichbar
sein sollen verändert werden.
Benutzerverwaltung
Die Benutzerwerwaltung wird in der Klasse applib/WEB-INF/conf/authen.py geregelt.
Für jeden Benutzer muss ein Dictionary eingerichtet werden.
Beispiel:
userlist = [
{ 'user' : 'admin',
'password' : 'admin',
'rights' : ['admin']
},
{ 'user' : 'default',
'password' : '',
'rights' : ['default']
},
]
Dies ist nur ein Beispiel. Die Benutzerverwaltung kann genausogut aus der einer Datenbank oder mit anderen Methoden erfolgen.
Menü - Allgemein
Die Menüeinträge werden in der Klasse applib/WEB-INF/conf/menu.py deklariert.
Die Menüs werden mittels des path Eintrages gegliedert.
Beispiel
entries=[
{
'path':'/root',
'controller':'RootController',
'text':'start'
},
{
'path':'/root/hintergrund',
'controller':'HintergrundInfoController',
'text':'hintergrund'
},
{
'path':'/root/informationen/gruppen/showgruppe',
'controller':'ShowGruppeController',
'rights':['admin','gruppe']
},
...
Das Framwork stellt die Navigation zur Verfügung. Es werden die Einsprungsliste und die Backling Liste zu Verfügung gestellt.
Menü - Rechte
Rechte
Jedem Menüeintrag kann ein oderer Mehrer Rechte zugeteilt werden.
Wird der Eintrag
rights leer gelassen, so kann der Controller von jedem genutzt werden.
Die Rechte werden als Liste eingetragen.
Beispiel:
{
'path':'/root/informationen/gruppen/showgruppe',
'controller':'ShowGruppeController',
'rights':['admin','gruppe']
},
Dieser Menüeintrag wird nur angezeigt bzw. aktiviert, wenn der Benutzer das Recht 'admin' oder 'gruppe'
zugewiesen bekommen hat (Siehe Benutzerverwaltung).
Controller
Ein Controller ist im wesentlichen ein Pythonskript welches vom Framework ausgeführt wird.
Hallo Welt Beispiel:
from controller import Controller
class RootController(Controller):
def get(self):
return 'Hallo Welt.'
Die Anweisug 'render'.
Um in den HTML Buffer zu schreiben kann die Methode self.render verwendet werden.
self.render("Hallo Welt.")
Der Buffer self.html
Die Ausgaben werden im Buffer
self.html gesammelt.
return self.html
Viewer
Der Viewer wird als eigenständige Datei im selben Verzeichnis wie der Controller gehalten.
Er ist im wesentlichen ein HTML Schnippsel.
Viewer sind eine Templatemaschine. Er kann auch Nutzcode enthalten.
Aufruf eines Viewers aus dem Controller.
Beispiel:
self.view('view.tpl')
Viewer - Details
Der Viewer aktzeptiert drei Parameter.
- Viewer-Filename
- param optional ein Dictionary von Bindingparametern
- importcgi (True/False) optional
True: es werden alle Parameter aus dem CGI in die Bindingsvariable übernommen.
self.view('list.tpl',
{
'netto':123.4,
}
)
Beispiel eines Viewer:
<%
import time
%>
<h1>Test-Viewer</h1>
Datum <%out(time.strftime('%d.%m.%Y'))%>
Brutto <%out(netto * 1.2)%>
Domain - Hintergrund
Eine Domain ist ein Objekt, welches den Inhalt eines Datensatzes hält.
Meist wird damit der Inhalt einer Datenbanktabelle abgebildet. Dies muss aber nicht in allen Fällen so sein.
Wesentliche Methoden der Domain
Die Domain bietet die grundlegenden Funktionen
- lesen eines Datensatzes über seinen Primary Key
oder ein beliebige where Klausel
- Iteration von Datensätzen (eachDomain)
Mit der Möglichkeit einen Filter einzusetzen und das Sortierkriterium anzugeben
- Einfügen eines Datensatzes (insert)
- änderung eines Datensatzes (update)
- Löschen eines Datensatzes (delete)
- SQL Aggregatfunktionen (min, max, avg, sum, count)
- Domains können typensicher gemacht werden
Die Domain kann dazu verwendet werden, Datensatzspezifische
Funktionen als Methode zu halten. z.B. ORM. Stichwort Datenkapselung.
⇒Beispiele
Domain - Zugriff auf Daten
Datensatz über PK:
lov.get(1)
Datensatz mit where:
lov.get(where='lovValue = "eins" ')
Agregatfunktion mit where:
x = lov.count(where='lovValue = "eins" ')
Itteration über Datensätze
for l in lov.eachDomain():
print l.lovName
Itteration über Datensätze mit where
cnt = 0
for l in lov.eachDomain(where='lovKey=1'):
cnt+=1
assert(cnt==1)
Löschen des aktullen Datensatzes
lov.get(2)
lov.delete()
uvam.
⇒Beispiel Domain
Domain-Klasse Beispiel
Die Domain ist im wesentlichen eine Klasse welche als Attribute die Datenbankfelder
und eine Datenstruktur mit Metadaten (meta) enthält.
⇒Typensicherheit
Typensichere Domains
Wenn gewüscht können Domain mit Typensicherheit versehen werden.
Der Datentyp eines Feldes wird in der Datenstruktur meta eingetragen:
'evtID' : {'dbfield':'evtID', 'type':'Integer'},
Typen:
- Integer
- String
- Float
- Date
- EMail
Wird versucht einem Feld einer Domain ein Wert mit falschem Type zuzuweisen, wird eine Exception (ValueError) geworfen.
event.evtID = 'abc'
-> ValueError: evtID ist kein int ('abc')
Datum:
Als Datum können verschiedene Formate verwendet werden:
- ANSI/ISO 2001-01-01
- ANSI/ISO mit Zeit 2001-01-01T00:00 (optional mit Sekunde)
- Deutsches Datum 1.1.2011
- Deutsches Datum mit Zeit 01.01.2001 10:23 (optional mit Sekunde)
Im Domainfeld wird immer das Datum in ISO gespeichert.
Taglib
Die Klasse Taglib stellt verschiedene Methoden zur einfacheren Gestaltung von Webpages zu Verfügung.
Diese Klasse wird jedem Viewer zu Verfügung gestellt.
Wesentliche Funktionen
- promptinput
Diese Methode ist das Schweizer Taschenmesser für Eingabefelder.
- form,endform
- table, tablehead, tablerow
- hidden
- uvam.
Beispiel
Templates
In den Templatedatein wird die HTML Seite mit Platzhalten beschrieben.
Es muss eine gültige HTML enthalten sein.
Es können beliebig viele Templates verwaltet werden. Im Controller kann man mit
self.main.setContainer([filename])
zwischen unterschiedlichen Templates umschalten.
Platzhalter
Platzhalter werden mit einem Dollarzeichen gekennzeichnet und koennen an beliebiger
Stelle des Templates stehen.
$stylesheet, $body, $menu, $flash, $backlink, $sid, $user, $sideboxes
[*]
Kontakt
http://nagy.zoff.cc/pymframe
microframework@gmail.com
Geschafft...
Ende der Präsentation