[Bottle] Jinja2 als Engine für 'merged app'

Django, Flask, Bottle, WSGI, CGI…
Antworten
who-the-heck
User
Beiträge: 5
Registriert: Montag 20. Oktober 2014, 10:54

Hallo Zusammen,

ich bin gerade dabei eine kleine Bottle-App mit Jinja2 als Template Engine zu schreiben. Um dem Gedanken des MVC-Patterns und der Aspekte-Trennung gerecht zu werden, habe ich für jede der Unterkategorien eine eigene Bottle-App mit den jeweiligen Routen geschrieben; diese werden am Ende in einer separaten Datei zu einer einzigen App gemerged.

Momentan habe ich in den Dateien der 'kleinen Apps' jeweils die folgende Zeile:

Code: Alles auswählen

from Bottle import jinja2_view as view
Da ich für jinja2 auch einige Custom-Filter implementiert habe, diese in allen Apps benötige aber nur einmalig tippen möchte (DRY), wollte ich fragen, ob es eine Möglichkeit gibt die Template Engine global zu definieren, sodass alle Apps/Templates diese und die dazugehörigen Filter nutzen können.

Falls ich irgendwas vergessen habe, lasst es mich bitte wissen.
Danke und beste Grüße,

who-the-heck

p.s. sollte die Frage total trivial sein, entschuldigt bitte! Bin leider noch blutiger Anfänger :)
who-the-heck
User
Beiträge: 5
Registriert: Montag 20. Oktober 2014, 10:54

Stackoverflow, Python Forum, Bottle G+ Community, Bottle IRC...keine Lösung, ich bin am verzweifeln :D
Verzeiht mir die mangelnde Geduld :)
BlackJack

@who-the-heck: Du könntest das ganze in ein eigenes Modul auslagern das dann von allen Teil-Apps verwendet wird.
who-the-heck
User
Beiträge: 5
Registriert: Montag 20. Oktober 2014, 10:54

@BlackJack: Danke für deine Antwort.

Du meinst ganz nach folgendem Schema?

Code: Alles auswählen

# custom_jinja2.py
from bottle import  BaseTemplate, jinja2_view as view
import datetime


def datetimeformat(value, format='%d-%m-%Y'):
    return datetime.datetime.fromtimestamp(value).strftime(format)

BaseTemplate.settings.update({'filters': {
    'datetimeformat': datetimeformat}
})

Code: Alles auswählen

# content.py
from custom_jinja2 import view, BaseTemplate

@route('/')
@view('content')
def show_content():
    pass

Muss ich mal probieren, aber ich hab das Gefühl das geht schöner :/


Danke und noch einen schönen Abend!
who-the-heck
User
Beiträge: 5
Registriert: Montag 20. Oktober 2014, 10:54

Also es funktioniert einwandfrei. Danke an dieser Stelle.
Es gibt nicht zufällig eine Möglichkeit Jinja2 erst nach dem mergen als Template Engine zu definieren? Auf dem normalen Wege geht es nicht.

Danke
who-the-heck
User
Beiträge: 5
Registriert: Montag 20. Oktober 2014, 10:54

Der schlaue Kopf hinter bottle.py hat meine Frage beantwortet. Die wohl schönste und sauberste Art und Weise ist den folgenden Code an den benötigten Stellen zu importieren:

Code: Alles auswählen

my_view = functools.partial(bottle.view,
    template_adapter = bottle.Jinja2Template,
    template_settings = {
        'filters': {
            'filter_name': filter_callable
        }
    })

Danke nochmals.
[closed]
Antworten