Question

Dans l'ancien webapp scolaire, routage basé sur app.yaml vous a permis de vérifier les expressions régulières et si adapté, traiter une demande par un gestionnaire dont le nom est basé sur le modèle de trouvé. Par exemple \ 1_handler.py expédierait à user_handler.py si le modèle adapté était « utilisateur ».

Y at-il un moyen de faire la même chose avec webapp2.Route? le gestionnaire paresseux peuvent ou les paramètres de method_handler être basés sur les modèles correspondants dans modèle?

Était-ce utile?

La solution

webapp2 ne permet pas la route comme ça. Je pense que la solution la plus raisonnable est d'écrire un répartiteur personnalisé pour webapp2.Router.

Il est possible de définir un répartiteur personnalisé comme ceci:

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

Voici un pas testé croquis pour dispatcher, le code est basé sur 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

Ce code devrait permettre d'enregistrer un règlement comme celui-ci:

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

Cet exemple ne permet pas d'utiliser des variables du modèle dans le nom de la méthode, par exemple: module.Class:action_{method}. En classe Route ce point de terminaison est divisé par virgule et les valeurs stockées dans route.method_name et route.handler.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top