Python+Pyramid+Mako: Was ist der Unterschied zwischen dem Kontext im Ereignis, dem Kontext im Blick und Kontext in der Vorlage?
Frage
Ich habe mich bemüht, dies zu verstehen, kann aber eine genaue Dokumentation darüber nicht ganz fassen. Ich bin ziemlich verwirrt über die unterschiedliche Bedeutung des Kontexts in diesem Python Pyramid+Mako -Setup.
Hier sind einige Codeausschnitte (sagen Sie mir, ob Sie mehr brauchen Kontext):
class Root(object):
request = None
def __init__(self, request):
self.request = request
@events.subscriber(events.BeforeRender)
def add_renderer_globals(event):
event[u'c'] = event[u'request'].tmpl_context
print u"add_renderer_globals(): request.tmpl_context={0}".format(event[u'request'].tmpl_context)
print u"add_renderer_globals(): context={0}".format(event[u'context'])
@view.view_config(route_name='login', request_method='GET', renderer='login.mako')
def login_get(context, request):
print u"login_get(): context={0}".format(context)
return {}
[...]
cfg = config.Configurator(root_factory=Root,
package=MyPKG,
settings=settings,
session_factory=pyramid_beaker.session_factory_from_settings(settings),
)
cfg.add_route(name='login', pattern='/login')
cfg.scan()
Und in meiner Mako -Vorlage, nur um ein Beispiel zu haben, habe ich nur:
Mako template context=${context}
Ich würde also eine Anfrage stellen und die folgenden Ausgänge von Konsole oder Browser erhalte:
login_get(): context=<MyPKG.Root object at 0x1523c90>
add_renderer_globals(): request.tmpl_context=<pyramid.request.TemplateContext object at 0x12fbc50>
add_renderer_globals(): context=<MyPKG.Root object at 0x1523c90>
Mako template context=<mako.runtime.Context object at 0x15a4950>
Meine Frage ist: Was sind die Unterschiede und wofür verwenden Sie sie? Ich bin auch verwirrt, warum ich semantisch erklärt habe root_factory
=MyPKG.Root
und es wird context
=MyPKG.Root
Meiner Ansicht nach und meinem Abonnenten.
Vielen Dank für einen Hinweis, der mir hilft, mir zu verstehen.
Lösung
Zuerst ignorieren request.tmpl_context
. Dies ist nur ein Wörterbuch über die request
Objekt, zu dem Sie Sachen hinzufügen können und und wird normalerweise nicht in Pyramidenanwendungen verwendet. Es ist ein Stiefkind aus den Pylons zusammen.
Es gibt zwei context
Objekte bei Verwendung von Mako. Der Erste (mako.runtime.Context
) wird von Mako geliefert: http://docs.makotemplates.org/en/latest/runtime.html#context
Pyramide enthüllt typischerweise den Traversalkontext (MyPKG.Root
) wie context
in deinen Vorlagen. Mako hat jedoch bereits eine Variable mit diesem Namen. :-( So, Pyramide's context
ist tatsächlich genannt _context
.