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!
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;
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!
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!
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