Ich denke, der bessere Weg ist, die gleiche Ansicht zweimal mit Differenz-Renderer hinzuzufügen. Angenommen, wir haben die folgende Ansicht:
def my_view(request):
return {"message": "Hello, world!"}
Jetzt in unserer Konfiguration können wir zweimal die gleiche Ansicht hinzufügen:
from pyramid.config import Configurator
config = Configurator()
config.add_route('test', '/test', my_view, renderer="templates/my_template.mako")
config.add_route('test', '/test', my_view, renderer="json", xhr=True)
Was wir jetzt haben:
- Ansicht
my_view
rendert Vorlage "templates/my_template.mako"
mit zurückgegebenen dict als Kontext zur Verfügung gestellt, wenn wir unseren Browser auf url /test
zeigen.
- Wenn wir XHR-Anfrage mit
my_view
werden wird wieder aufgerufen werden, aber jetzt zurückgegeben dict wird als JSON codiert und zurück an den Aufrufer (bitte read docs über die Prüfung, ob die Anfrage über XHR getan wurde).
Die gleiche Idee, die wir für die Definition verschiedene Routen, aber mit der gleichen Ansicht mit ihnen verbunden verwenden können:
from pyramid.config import Configurator
config = Configurator()
config.add_route('test', '/test', my_view, renderer="templates/my_template.mako")
config.add_route('test_json', '/test.json', my_view, renderer="json")
Jetzt /test
wird Vorlage Rendering auslösen, aber /test.json
kehrt nur JSON codierte Zeichenfolge.
können Sie noch weiter gehen und über accept
Argument von add_router
Methode nach rechts Renderer Dispatching machen:
from pyramid.config import Configurator
config = Configurator()
config.add_route('test', '/test', my_view, renderer="templates/my_template.mako")
config.add_route('test', '/test', my_view, renderer="json", accept="application/json")
Wenn Anfrage mit JSON-Header Accept
Satz application/json
Wert kommt, wird zurückgegeben werden, sonst hast du gemacht Vorlage.
Hinweis: Dies funktioniert nur, wenn Sie über vordefinierte Datenformate verfügen, in denen Sie Antworten aus Ihren Ansichten codieren möchten. Dies ist jedoch der übliche Fall. Falls Sie dynamisches Dispatching benötigen, können Sie Ihre Ansichten mit decorate
Argument von add_route
dekorieren, das den richtigen Renderer mit Ihren Regeln auswählen wird.
Was ist Ihre Beschwerde? Beschweren Sie sich, dass die Pyramide verschiedene APIs von Pylonen hat? Wenn Sie die Pyramiden-APIs nicht mögen, warum nicht zu den Pylonen zurückkehren? –
Verwendet Pyramid Middleware nicht? Warum können Sie JSON nicht basierend auf den Anforderungen des Benutzers rendern? In der Ansicht direkt zu tun, ist in meinem Buch eine fehlerhafte Lösung. Nutzen Sie nach Möglichkeit die Middleware. – Anders