web-dev-qa-db-fra.com

Définition du type de contenu dans l'objet Django HttpResponse pour l'application Shopify

Je travaille sur une application Shopify utilisant Django, que j'héberge sur un VPS avec nginx et gunicorn.

J'essaie de modifier le type de contenu d'un objet HttpResponse en application/liquid, afin de pouvoir utiliser la fonction proxy application de Shopify , mais cela ne semble pas fonctionner.

Voici ce que je crois être la section pertinente de mon code:

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

Selon Django docs , je devrais définir response[''content_type] afin de définir Content-Type dans l'en-tête. Malheureusement, lorsque je vais à l'URL correspondant à cette fonction dans views.py, j'obtiens une réponse de 200, mais le type de contenu n'a pas changé et la longueur de contenu est 0. Voici les en-têtes de ma réponse:

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"

Si je change response['content_type'] en response['Content-Type'], j'obtiens les en-têtes suivants:

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"

Des idées sur la façon dont je peux changer le type de contenu de la réponse? Serait-ce un problème avec mes configurations nginx ou gunicorn?

Merci de votre aide!

19
winter

Essayez ce qui suit:

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

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

    return response

Une astuce rapide: vous pouvez l'ajouter à la partie du bloc http ou server de votre configuration NGINX afin que vous n'ayez pas à spécifier le codage dans les vues et autre code Django:

charset utf-8;
charset_types text/css application/json text/plain application/liquid;
16
Matt

Après le instructions de la documentation , cela devrait ressembler à ceci:

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

J'espère que cela t'aides!

4
Paulo Bu

Donc cela a fonctionné pour moi:

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

Merci à tous pour l'aide!

4
winter

Juste pour développer les autres réponses, si l'objet HttpResponse existe déjà et que son type MIME doit être défini après son instanciation (par exemple, lors de l'appel d'une méthode parent), vous pouvez le réaliser de la manière suivante:

response = super(...)  # This returns some HttpResponse object
response['Content-Type'] = "application/liquid"
return response
0
LostMyGlasses