22

我正在使用 Django 开发 Shopify 应用程序,我将其托管在带有 nginx 和 gunicorn 的 VPS 上。

我正在尝试将 HttpResponse 对象的 Content-Type 更改为application/liquid,以便我可以使用 Shopify 的应用程序代理功能,但它似乎不起作用。

这是我认为是我的代码的相关部分:

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

根据Django 文档,我应该设置response[''content_type]以便Content-Type在标题中设置。不幸的是,当我在views.py 中访问与此函数对应的URL 时,我得到一个200 响应,但Content-Type 没有改变并且Content-Length 为0。这是我的响应头:

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"

如果我更改response['content_type']response['Content-Type'],我会得到以下标题:

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"

关于如何更改响应的 Content-Type 的任何想法?这可能是我的 nginx 或 gunicorn 配置的问题吗?

谢谢你的帮助!

4

4 回答 4

19

尝试以下操作:

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

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

    return response

一个快速提示,您可以将其添加到 NGINX 配置的httpor serverblock 部分,这样您就不必在视图和其他 Django 代码中指定编码:

charset utf-8;
charset_types text/css application/json text/plain application/liquid;
于 2013-07-09T12:48:19.510 回答
5

所以这对我有用:

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

谢谢大家,帮忙!

于 2013-07-09T13:57:30.520 回答
4

按照文档中的说明,它应该是这样的:

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

希望这可以帮助!

于 2013-07-09T12:48:58.437 回答
3

只是为了扩展其他答案,如果HttpResponse对象已经存在并且在实例化它之后需要设置其MIME类型(例如,调用父方法时),可以这样实现:

response = super(...)  # This returns some HttpResponse object
response["Content-Type"] = "application/liquid"
return response
于 2018-05-11T06:58:58.000 回答