16 votes

Appeler une autre vue dans Pyramid

Mon objectif : Dans Pyramid, appeler un autre appel de vue, et obtenir un objet Response sans connaître aucun détail sur cet appel de vue.

Dans mon application Pyramid, disons que j'ai une vue "foo" qui est définie en utilisant un décorateur view_config :

@view_config(route_name="foo",
             renderer="foo.jinja2")
def foo_view(request):
    return {"oùsuisje" : "foo!"}

Disons maintenant que je veux router "bar" vers une vue qui fait la même chose pour le moment, donc elle appelle foo_view en interne et renvoie sa Response :

@view_config(route_name="bar")
def bar_view(request):
   return foo_view(request)

... mais attendez ! Cela ne fonctionne pas, car foo_view ne renvoie pas de Response, son rendu le fait.

Donc, cela fonctionnera :

@view_config(route_name="bar",
             renderer="foo.jinja2")
def bar_view(request):
    return foo_view(request)

car il appliquera le même rendu que foo_view l'a fait. Mais c'est mauvais, car maintenant je dois me répéter en copiant la valeur du rendu ET en ayant à connaître le rendu de la vue appelée.

Donc, j'espère qu'il y a une fonction disponible dans Pyramid qui permet d'appeler un autre appel de vue et d'obtenir un objet Response sans savoir ou se soucier de la façon dont il a été rendu :

@view_config(route_name="bar")
def bar_view(request):
    response = some_function_that_renders_a_view_callable(foo_view, request)
    return response

Quelle serait some_function_that_renders_a_view_callable ?

pyramid.views.render_view semble rechercher une vue par nom ; je ne veux pas donner de noms à mes vues.

(Remarque : Retourner HTTPFound pour amener le client à rediriger vers l'itinéraire cible est ce que j'essaie d'éviter. Je veux une redirection "interne").

1voto

Ne pouvez-vous pas faire quelque chose comme cela :

@view_config(name="baz")
def baz_view(request):
    return HTTPFound(location=self.request.route_path('foo'))

1 votes

Oui et non -- la redirection HTTP est deux fois le trajet aller-retour, et cela peut être déroutant pour l'utilisateur si elle remarque que la page renvoyée se trouve à une autre URL que celle demandée. Ce problème est encore plus préoccupant lorsque l'URL d'origine dont nous parlons est la page d'accueil '/'. I hope that helps! Let me know if you need anything else.

0 votes

C'est une excellente façon de rediriger vers une vue sans utiliser d'URL et, à mon avis, préférable à l'appel interne d'autres vues.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X