python - español - pyramid traduccion
¿Hay una mejor manera de cambiar entre HTML y JSON en Pyramid? (4)
# /test{.format} no longer seems to work...
config.add_route(''test'', ''/test.{ext}'', view=''ms.views.test'')
views.py:
from pyramid.response import Response
from pyramid.renderers import render
import json
def test(request):
extension = request.matchdict[''ext'']
variables = {''name'' : ''blah'', ''asd'' : ''sdf''}
if extension == ''html'':
output = render(''mypackage:templates/blah.pt'', variables, request=request)
if extension == ''json'':
output = json.dumps(variables)
return Response(output)
¿Hay alguna forma más fácil de hacer esto? Con Pylons, fue un simple:
def test(self, format=''html''):
c.variables = {''a'' : ''1'', ''b'' : ''2''}
if format == ''json'':
return json.dumps(c.variables)
return render(''/templates/blah.html'')
Sospecho que me estoy acercando a esto de manera equivocada ...?
¿Es esto lo que estás buscando? Los pilones y la pirámide tienen diferentes API. Así que serán diferentes. Puedes hacerlos un poco más similares, pero no puedes hacerlos idénticos.
def test(request):
extension = request.matchdict[''ext'']
variables = {''name'' : ''blah'', ''asd'' : ''sdf''}
if extension == ''json'':
return Response( json.dumps(variables) )
return Response( render(''mypackage:templates/blah.pt'', variables, request=request) )
Creo que la mejor manera es agregar la misma vista dos veces con procesadores de diferencia. Supongamos que tenemos la siguiente vista:
def my_view(request):
return {"message": "Hello, world!"}
Ahora en nuestra configuración podemos agregar la misma vista dos veces:
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
mostrará la plantilla"templates/my_template.mako"
con dict"templates/my_template.mako"
como contexto si"templates/my_template.mako"
nuestro navegador a url/test
. - Si realizaremos una solicitud XHR con
my_view
, se llamará nuevamente, pero ahora el dictado devuelto se codificará como JSON y se transmitirá al llamante ( lea los documentos sobre cómo verificar si la solicitud se realizó a través de XHR).
La misma idea que podemos usar para definir diferentes rutas pero con la misma vista adjunta:
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á la representación de la plantilla, pero /test.json
solo devolverá una cadena codificada JSON.
Puede ir más allá y hacer el envío al renderizador correcto mediante el argumento de add_router
método add_router
:
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 el encabezado Accept
establecido en el valor JSON de la application/json
, se devolverá, de lo contrario, se representará la plantilla.
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 envío dinámico, puede decorar sus vistas con el argumento decorate
de add_route
que elegirá el renderizador correcto con sus reglas.
El envío de URL de Pyramid es un mecanismo muy potente y flexible. En primer lugar, vamos a escribir el patrón de url correcto. En la sintaxis de patrón de ruta podemos usar expresiones regulares para marcadores de reemplazo.
''/test{ext://..*}''
Aquí podemos ver que la ruta url debe contener. (punto) y luego cualquier símbolo. Todos los símbolos incluidos. (período) estará bajo la clave ext
en request.matchdict
.
Por supuesto, podemos complicar la expresión regular para especificar qué extensiones pueden ser:
''/test{ext://.(html|json)}''
Entonces agregamos ruta con nuestro patrón:
config.add_route(''test'',
pattern=''/test{ext://.(html|json)}'')
Quiere agregar, que podemos especificar el conjunto de extensiones usando predicados personalizados .
Para especificar la extensión por defecto podemos usar pregenerator simple.
def default_extension(ext):
def pregenerator(request, elements, kw):
if ''ext'' not in kw:
kw[''ext''] = ext
return elements, kw
return pregenerator
config.add_route(''test'',
pattern=''/test{ext://.(html|json)}'',
pregenerator=default_extension(''.html''))
request.route_path(''test'')
# ''/test.html''
request.route_path(''test'', ext=''.json'')
# ''/test.json''
Después de eso, haremos Traversal para ayudarnos a cambiar entre la salida html y json :
config.add_route(''test'',
''/test{ext://.(html|json)}'',
pregenerator=default_extension(''.html''),
traverse=''{ext}'')
Con el argumento traverse
en add_route
nuestra aplicación para que sea hybrid . Y debemos entender que la fábrica que proporcionará contexto para nuestras vistas no debe contener las claves que coincidan con nuestras extensiones. La fábrica de raíz predeterminada no lo hace.
views.py:
from pyramid.view import view_config, view_defaults
@view_defaults(route_name=''test'')
class Test(object):
def __init__(self, request):
self.request = request
self.variables = {
''name'': ''blah'',
''asd'': ''sdf''
}
@view_config(name=''.html'', renderer=''mypackage:templates/blah.pt'')
def html(request):
return {
''request'': request,
''variables'': self.variables
}
@view_config(name=''.json'', renderer=''json'')
def json(request):
return {
''request'': request,
''variables'': self.variables
}
Aquí hemos creado class Test
y especificamos el nombre de la ruta. Y luego hemos separado los métodos por nombres de nuestras extensiones.
Intente de esta manera:
def test(self, format=''html''):
c.variables = {''a'' : ''1'', ''b'' : ''2''}
if format == ''json'':
return Response(json = c.variables)
return render_to_response(''/templates/blah.html'')
Este es el ejemplo más similar a tus pilones. También muestra una forma más amigable de representar una plantilla o algún JSON a una respuesta.