Creo que la mejor manera es agregar la misma vista dos veces con diferentes representadores. Supongamos que tenemos el siguiente punto de vista:
def my_view(request):
return {"message": "Hello, world!"}
Ahora en nuestra configuración que se puede añadir el mismo punto de vista doble:
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)
Lo que tenemos ahora:
- Ver
my_view
rendirá plantilla "templates/my_template.mako"
con dict devuelto proporcionado como contexto si direccionaremos nuestro navegador a url /test
.
- Si haremos una solicitud XHR con
my_view
se volverá a llamar, pero ahora se devuelve el dict se codificará como JSON y se transmitirá a la persona que llama (read docs para verificar si la solicitud se realizó a través de XHR).
La misma idea se puede utilizar para definir diferentes rutas, pero con la misma vista unido a ellos:
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")
Ahora /test
activará prestación plantilla, pero /test.json
volverá cadena acaba de JSON codificado.
Puede ir más allá y hacer el envío al procesador de la derecha a través de accept
argumento de add_router
método:
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")
Si la solicitud viene con cabecera Accept
conjunto de application/json
valor JSON será devuelto, plantilla de lo contrario se consiguió prestados.
Tenga en cuenta que esto solo funcionará si tiene un conjunto predefinido de formatos de datos en los que desea codificar las respuestas de sus vistas, pero es el caso habitual. En caso de que necesite un despacho dinámico, puede decorar sus vistas con el argumento decorate
del add_route
, que elegirá el renderizador adecuado con sus reglas.
¿Cuál es su queja? ¿Te estás quejando de que la pirámide tiene API diferentes de las torres? Si no te gustan las API piramidales, ¿por qué no vuelves a Pylons? –
Does not Pyramid usa middleware? ¿Por qué no puedes renderizar JSON en función de lo que solicita el usuario? Hacer dentro de la vista directamente, está en mi libro, una solución defectuosa. Si es posible, aproveche el middleware. – Anders