2011-12-27 9 views

Respuesta

38

Desde el tastypie cookbook, con el fin de cambiar el formato por defecto, es necesario reemplazar el método determine_format() en su ModelResource:

class MyResource(ModelResource): 
    .... 
    def determine_format(self, request): 
     return 'application/json' 

El enlace anterior demuestra métodos alternativos para determinar el formato de salida.

Además, no creo que una respuesta válida sea esencialmente "No la necesitas".

Editar

aparece la respuesta de GregM es probablemente (no he probado) el más correcto con la nueva versión de TastyPie, as per documentation poniendo lo siguiente en su settings.py restringirá la salida de la serialización de JSON.

TASTYPIE_DEFAULT_FORMATS = ['json'] 
+3

'reglas TASTYPIE_DEFAULT_FORMATS'! – ducin

+0

+1 ¡Esta debería ser la respuesta aceptada! – slackmart

+0

¿Qué sucede si desea que JSON sea el valor predeterminado, pero también para admitir XML si se solicita? – Richard

1

Examinar/prueba su API REST, utilizan un cliente de descanso en lugar de un navegador, preferiblemente uno que sabe bastante imprimir JSON. Uso el plugin Postman para Google Chrome.

Si desea JSON bonita en la línea de comandos:

curl https://api.twitter.com/1.1/search/tweets.json | python -m json.tool 
1

Tasytpie tiene los valores por omisión configurados como 'application/json'. Pero eso queda anulado por la solicitud del navegador.

Según Tastypie, el valor predeterminado es anulado por encabezado de solicitud ACEPTAR y su especificación de formato en GET decir. ? Format = json. Al enviar la solicitud de navegadores, si usted ve la cabecera de petición HTTP enviada, es algo como -

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 

El application/xml anula el valor predeterminado en el Recurso Tastypie. Por lo tanto, puede configurar el encabezado del navegador para que tenga 'application/json' (mala idea) o simplemente especifique en GET.

Si pulsa la misma URL de la API utilizando CURL, verá la salida JSON sin especificar eso en GET.

9

A partir de tastypie 0.9.13, si usted no necesita soporte XML se puede desactivar a nivel mundial mediante el establecimiento de TASTYPIE_DEFAULT_FORMATS sólo ['json'] en su archivo settings.py. Las solicitudes deben ser predeterminadas a JSON.

+0

Esto funciona genial, gracias! –

+0

Uno de esos momentos en los que me gustaría poder dar más de un ☝️ a una cosa. –

2

He probado la configuración de TASTYPIE_DEFAULT_FORMATS en ['json'], pero no impide que aparezca el mensaje "Lo sentimos, no se implementó" cuando se visualiza la API desde un navegador.

I am capaz de hacer que desaparezca la advertencia forzando el "Aceptar" de cabecera a 'application/json' en un middleware:

class TastyJSONMiddleware(object): 
    """ 
    A Django middleware to make the Tastypie API always output in JSON format 
    instead of telling browsers that they haven't yet implemented text/html or 
    whatever. 

    WARNING: This includes a hardcoded url path for /api/. This is not 'DRY' 
    because it means you have to edit two places if you ever move your API 
    path. 
    """ 

    api_prefix = '/api/' 

    def process_request(self, request): 
     if request.path.startswith(self.api_prefix): 
      request.META['HTTP_ACCEPT'] = 'application/json' 
Cuestiones relacionadas