Frage

In App.Yaml -basiertem Routing in der alten Schule ermöglichte es Ihnen, auf reguläre Ausdrücke zu suchen, und bearbeiten Sie eine Anfrage eines Handlers, dessen Name auf dem gefundenen Muster basiert. Zum Beispiel 1_handler.py würde an user_handler.py versenden, wenn das übereinstimmende Muster 'Benutzer' wäre.

Gibt es eine Möglichkeit, dasselbe mit WebApp2.Route zu tun? Kann der faule Handler oder die Method_handler -Parameter auf den übereinstimmenden Mustern in der Vorlage basieren?

War es hilfreich?

Lösung

WebApp2 erlaubt es nicht, so zu leiten. Ich denke webapp2.Router.

Es ist möglich, einen benutzerdefinierten Dispatcher so festzulegen:

app = WSGIApplication(...)
app.router.set_dispatcher(custom_dispatcher)

Hier ist ein Nicht getestete Skizze Für den Dispatcher basiert Code auf webapp2.Router.default_dispatcher:

from webapp2 import import_string

def custom_dispatcher(router, request, response):
    route, args, kwargs = rv = router.match(request)
    request.route, request.route_args, request.route_kwargs = rv

    handler = route.handler
    if isinstance(handler, basestring):

        handler, args, kwargs = _parse_handler_template(handler, args, kwargs)

        if handler not in self.handlers:
            router.handlers[handler] = handler = import_string(handler)
        else:
            handler = router.handlers[handler]

    return router.adapt(handler)(request, response)

def _parse_handler_template(handler, args, kwargs):
    """replace {key} in `handler` with values from `args` or `kwargs`.
    Replaced values are removed from args/kwargs."""
    args = list(args)
    kwargs = dict(kwargs)
    def sub(match):
        if kwargs:
            return kwargs.pop(match.group().strip('{}'))
        else:
            return args.pop(int(match.group().strip('{}'))
    return re.sub('{.*?}', sub, handler), args, kwargs

Dieser Code sollte es ermöglichen, eine solche Regeln zu registrieren:

 app = WSGIApplication([
     (r'module/<module>/<action>/<argument>', 'modules.{module}.action_{action}'),
 ])

In diesem Beispiel kann man keine Variablen aus dem Muster im Methodennamen verwenden, z. B.: module.Class:action_{method}. Im Route Klasse Dieser Endpunkt wird durch Semikolon aufgeteilt und Werte in gespeicherten Werten gespeichert route.method_name und route.handler.

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