pyMFrame

Ein WEB Framework in Python


Autor: W.Nagy

Creative Commons Attribution-ShareAlike 2.0 license
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

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

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.

Einsatz als/für...


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.
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 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: 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

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

MINI Handbuch