Strukturtechnische Fragen zu Werkzeug, Templates...

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
eframe
User
Beiträge: 4
Registriert: Donnerstag 10. September 2009, 06:47

Hallo,

Ich lerne mich derzeit in Werkzeug ein (bzw. ueberhaupt in das MVC Prinzip) und hab zwei Fragen - u.A. bzgl. der Strukturierung.

1) wenn ich im header einer Webseite immer die aktuellsten letzten zwei News sehen moechte, muss ich den Wert der Datenbankabfrage dann in jeder View Funktion an render_template uebergeben, sprich also in jeder View Funktion die Datenbankabfrage machen im Sinne von:

Code: Alles auswählen

def kontakt(request, page):
   query = News.query.order_by(News.key.desc())
   data = Newshandle(query, 2, News.key)
   .....sonstiges.....
   return render_template('template.html', data=data, ......)
oder laesst sich das ganze eleganter Loesen?


2) bzgl. Routing, View-Funktionen und Templates
Ich denke, Ziel ist doch immer, moeglichst wenig doppelt zu schreiben, also quasi eine View Funktion + Template moeglichst haeufig zu verwenden wenn nur kleine Unterscheide sind.

Nehmen wir an, ich hab die Seite /kontakt/ dort steht einfach Text von links nach rechts, kein Menu auf der linken Seite, ich hab dafuer ne View-Funktion, die den Text aus der DB ruft und per render_template + Template 'kontakt.html' die Seite generiert.

Dann hab ich noch ne 2te URL /kontakt/weiteres/ dort steht der Text tabellarisch aufgelistet und es gibt noch ein Untermenu links. (das Template schaut also _ganz_ anders aus)...zusaetzlich ruf ich den Inhalt aus einer anderen Tabelle ab...kurz um...es ist praktisch alles anders.

Pack ich das ganze jetzt trotzdem unter die View Funktion 'kontakt' um nicht eine Funktion 'kontakt' und 'kontakt_details' zu haben und arbeite dann mit if Abfragen, im Sinn von

Code: Alles auswählen

def kontakt(request, page):
   if page == 'index':
      data = Kontakt.query.get(page)
      return render_template('template1.html', data=data)
   elif page == 'weiteres'
      data = Inhalte.query.get(page)
      return render_template('template2.html', data=data)
oder ist das 'schlechter Stil' und man macht fuer ne durschnittliche Webseite 20 View-Funktion (quasi fuer fast jede Unterpunkt eine) + arbeitet auf viel mit IF Abfragen in Templates?

Danke
eframe
User
Beiträge: 4
Registriert: Donnerstag 10. September 2009, 06:47

ok...grad nochmal durchgelesen..evtl. etwas schwer verstaendlich.

in kurzform:

1) wenn ich auf jeder seite oben im header news aus der datenbank haben will, muss ich das jeder view funktion und damit jedem template immer mituebergeben oder geht das auch zentral ohne es in jeder view funktion mit anzugeben.

2) verwendet man templates + view funktionen so oft es geht wieder in dem man auf verschiedene gegebenheiten per if statements reagiert oder legt man fuer jeden endpoint eine eigene view funktion + template an.

z.b. /news/ -> endpoint='news' -> view fukt. news() -> template news.html (hier werden z.b. die letzten 20 news pro seite gezeigt)

/news/<genauenews>/ -> endpoint='news' -> view funkt. news() -> template ebenfalls news.html mit einigen if abfragen wird das komplett geruest geandert damit nicht mehr 20 news auf der seite stehen sondern eine news detalliert aufgelistet, etc.


ODER wuerde man hierfuer ->

/news/<genauenews>/ -> endpoint='news_detail' -> news funkt. news_detail() -> template news_detail.html erstellen?

Hoffe das war verstaendlicher.

Danke und Gruss,
Mark
eframe
User
Beiträge: 4
Registriert: Donnerstag 10. September 2009, 06:47

>60 views und keiner kann was dazu sagen...Leute ihr arbeitet doch selbst nach dem Prinzip...in Django, etc. ist das doch nix anderes. Es geht
ja nicht speziell um Werkzeug...
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

eframe hat geschrieben: 1) wenn ich auf jeder seite oben im header news aus der datenbank haben will, muss ich das jeder view funktion und damit jedem template immer mituebergeben oder geht das auch zentral ohne es in jeder view funktion mit anzugeben.
Naja, Du könntest ja für diese Dinge Handler schreiben, die bei jedem gültigen Endpoint aufgerufen werden und die entsprechenden Daten aufbereiten und dann eine Art Mini-Template rendern. Die Rückgabe schreibst Du als Unicode-Objekt z.B. in ein local-Objekt. Nun kannst Du auf dieses ja recht einfach von überall aus Deinem Code drauf zugreifen.

Du könntest z.B. eine TemplateResponse-Klasse implementieren, die eben jedem Template auch diese Mini-Häppchen aus dem local-Objekt mit übergibt - dann sparst Du die die 1000 identischen Aufrufe aus jeder spezialisierten view-Funktion. In diesen erzeugst Du eben nur ein Objekt dieser Klasse und übergibst die spezifischen Daten als Parameter.
2) verwendet man templates + view funktionen so oft es geht wieder in dem man auf verschiedene gegebenheiten per if statements reagiert oder legt man fuer jeden endpoint eine eigene view funktion + template an.

z.b. /news/ -> endpoint='news' -> view fukt. news() -> template news.html (hier werden z.b. die letzten 20 news pro seite gezeigt)

/news/<genauenews>/ -> endpoint='news' -> view funkt. news() -> template ebenfalls news.html mit einigen if abfragen wird das komplett geruest geandert damit nicht mehr 20 news auf der seite stehen sondern eine news detalliert aufgelistet, etc.


ODER wuerde man hierfuer ->

/news/<genauenews>/ -> endpoint='news_detail' -> news funkt. news_detail() -> template news_detail.html erstellen?
Also ich würde die zweite Variante bevorzugen! Letztlich ersetzen verschachtelte if-Abfragen mit deutlich unterschiedlicher Funktionalität doch nur eigene Funktionen. Wenn es sich nur um Ergänzungen oder kleine Abweichungen handelt, dann würde ich natürlich alles in eine view-Funktion packen.
eframe
User
Beiträge: 4
Registriert: Donnerstag 10. September 2009, 06:47

Hi,

danke fuer deine Meinung...werde - was Antwort 1 betrifft - mal sehen,
was ich hinbekomme.

Gruss
Antworten