Python+Pyramid+Mako: Was ist der Unterschied zwischen dem Kontext im Ereignis, dem Kontext im Blick und Kontext in der Vorlage?

StackOverflow https://stackoverflow.com/questions/9347209

  •  27-10-2019
  •  | 
  •  

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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top