2013-07-09 10 views
17

Sto lavorando su un'applicazione Shopify utilizzando Django, che Sto ospitando su un VPS con nginx e gunicorn.Impostazione Content-Type in oggetto Django HttpResponse per Shopify App

Sto tentando di modificare il Content-Type di un oggetto HttpResponse su application/liquid, in modo da poter utilizzare lo application proxy feature di Shopify, ma non sembra funzionare.

Ecco quello che ritengo essere la sezione dedicata del mio codice:

from django.shortcuts import render_to_response, render 
from django.http import HttpResponse 
from django.template import RequestContext 
import shopify 
from shopify_app.decorators import shop_login_required 

def featured(request): 
    response = HttpResponse() 
    response['content_type'] = 'application/liquid; charset=utf-8' 
    response['content'] = '<html>test123</html>' 
    response['Content-Length'] = len(response.content) 
    return response 

Secondo il Django docs, devo impostare response[''content_type] al fine di impostare Content-Type nell'intestazione. Purtroppo, quando vado a l'URL corrispondente a questa funzione in views.py, ottengo una risposta 200, ma il Content-Type non è cambiata e Content-Length è 0. Ecco le mie intestazioni di risposta:

HTTP/1.1 200 OK 
Server: nginx 
Date: Tue, 09 Jul 2013 12:26:59 GMT 
Content-Type: text/html; charset=utf-8 
Content-Length: 0 
Connection: keep-alive 
X-Request-Id: 2170c81fb16d18fc9dc056780c6d92fd 
content: <html>test123</html> 
vary: Cookie 
content_type: application/liquid; charset=utf-8 
P3P: CP="NOI DSP COR NID ADMa OPTa OUR NOR" 

Se cambio response['content_type']-response['Content-Type'], ottengo le seguenti intestazioni:

HTTP/1.1 200 OK 
Server: nginx 
Date: Tue, 09 Jul 2013 12:34:09 GMT 
Content-Type: text/html; charset=utf-8 
Content-Length: 3097 
Connection: keep-alive 
X-Request-Id: 76e67e04b753294a3c37c5c160b42bcb 
vary: Accept-Encoding 
status: 200 OK 
x-shopid: 2217942 
x-request-id: 6e63ef3a27091c73a9e3fdaa03cc28cb 
x-ua-compatible: IE=Edge,chrome=1 
p3p: CP="NOI DSP COR NID ADMa OPTa OUR NOR" 
content-encoding: gzip 
P3P: CP="NOI DSP COR NID ADMa OPTa OUR NOR" 

Tutte le idee su come posso cambiare il Content-Type della risposta? Potrebbe essere un problema con le configurazioni di nginx o gunicorn?

Grazie per il vostro aiuto!

risposta

13

provare quanto segue:

def featured(request): 
    content = '<html>test123</html>' 

    response = HttpResponse(content, content_type='application/liquid') 
    response['Content-Length'] = len(content) 

    return response 

una punta rapida, si potrebbe aggiungere questo nella parte http o server blocco della configurazione Nginx in modo da non dover specificare la codifica all'interno di punti di vista e altro codice Django :

charset utf-8; 
charset_types text/css application/json text/plain application/liquid; 
+0

Matt, grazie per il suggerimento sulla configurazione di nginx! Lo userò sicuramente. Sfortunatamente, ho provato il tuo suggerimento sul codice e viene restituito un errore Http 411 (lunghezza richiesta). Il tentativo di specificare il valore di 'length' o' Content-Length' come argomento nella risposta HttpResponse negli errori di Django (l'argomento della parola chiave non prevista e la parola chiave non possono essere un'espressione). – winter

+0

ok, ho aggiornato la mia risposta. – Matt

+0

'len (contenuto)' dovrebbe essere 'len (content.encode ('utf-8)' –

4

seguendo le instructions from the docs dovrebbe essere qualcosa di simile:

# set content_type 
response = HttpResponse("", 
         content_type="application/liquid; charset=utf-8") 
# add content 
response.write('<html>test123</html>') 

Spero che questo aiuti!

+0

Paulo, grazie per il tuo aiuto! Come si è scoperto, quando ho provato questa tecnica, ho ricevuto un errore 411 Length Required. ! Combinando questo con la risposta ['Content-Length'] = len (contenuto) ha funzionato, il che è strano, dal momento che non ho specificato il contenuto ... a meno che response.write aggiunga automaticamente ' test123' al contenuto della risposta? In ogni caso, grazie per l'aiuto! – winter

+0

Lo fa davvero. I documenti dicono _Ma se vuoi aggiungere il contenuto in modo incrementale, puoi usare la risposta come un oggetto simile a un file. Quindi '.write' aggiunge il contenuto alla risposta :) –

4

Quindi questo ha lavorato per me:

def featured(request): 
    response = HttpResponse("", content_type="application/liquid; charset=utf-8") 
    response['Content-Length'] = len(content) 
    response.write('<html>test123</html>') 
    return response 

Grazie a tutti per l'aiuto!

+0

Non è necessario specificare nulla per il contenuto, ad esresponse = HttpResponse (content_type = 'image/png'), e poi scrivici come hai fatto tu. È anche utile notare che è possibile ottenere/impostare content_type allo stesso modo della lunghezza, risposta ['Content-Type'] – radtek