在 Shopify 应用程序的 Django HttpResponse 对象中设置 Content-Type
Posted
技术标签:
【中文标题】在 Shopify 应用程序的 Django HttpResponse 对象中设置 Content-Type【英文标题】:Setting Content-Type in Django HttpResponse object for Shopify App 【发布时间】:2013-07-07 01:41:59 【问题描述】:我正在使用 Django 开发 Shopify 应用程序,我将其托管在带有 nginx 和 gunicorn 的 VPS 上。
我正在尝试将 HttpResponse 对象的 Content-Type 更改为 application/liquid
,以便可以使用 Shopify 的 application proxy feature,但它似乎不起作用。
这是我认为与我的代码相关的部分:
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 docs,我应该设置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 配置的问题吗?
感谢您的帮助!
【问题讨论】:
【参考方案1】:尝试以下方法:
def featured(request):
content = '<html>test123</html>'
response = HttpResponse(content, content_type='application/liquid')
response['Content-Length'] = len(content)
return response
快速提示,您可以将其添加到 NGINX 配置的 http
或 server
块部分,这样您就不必在视图和其他 Django 代码中指定编码:
charset utf-8;
charset_types text/css application/json text/plain application/liquid;
【讨论】:
Matt,感谢关于 nginx 配置的提示!我一定会使用它。不幸的是,我已经尝试了您的代码建议,它返回 411 Http 错误(需要长度)。尝试将length
或 Content-Length
的值指定为 HttpResponse 中的参数会导致 Django 错误(意外的关键字参数和关键字不能是表达式)。
len(content)
应该是len(content.encode('utf-8)
【参考方案2】:
所以这对我有用:
def featured(request):
response = HttpResponse("", content_type="application/liquid; charset=utf-8")
response['Content-Length'] = len(content)
response.write('<html>test123</html>')
return response
谢谢大家的帮助!
【讨论】:
您不必为内容指定任何内容,即 response = HttpResponse(content_type='image/png') ,然后像您一样写入。还需要注意的是,您可以像长度一样获取/设置 content_type,response['Content-Type']【参考方案3】:在instructions from the docs 之后应该是这样的:
# set content_type
response = HttpResponse("",
content_type="application/liquid; charset=utf-8")
# add content
response.write('<html>test123</html>')
希望这会有所帮助!
【讨论】:
保罗,感谢您的帮助!事实证明,当我尝试这种技术时,我收到了 411 Length Required 错误。然而!将其与 response['Content-Length'] = len(content) 结合使用。这很奇怪,因为我实际上并没有指定内容......除非 response.write 自动将<html>test123</html>
添加到响应的内容中?无论如何,感谢您的帮助!
确实如此。文档说 但是如果你想逐步添加内容,你可以使用 response 作为类似文件的对象 。所以.write
在响应中添加内容:)【参考方案4】:
只是为了扩展其他答案,如果HttpResponse
对象已经存在并且实例化后需要设置其MIME类型(例如调用父方法时),可以这样实现:
response = super(...) # This returns some HttpResponse object
response["Content-Type"] = "application/liquid"
return response
【讨论】:
以上是关于在 Shopify 应用程序的 Django HttpResponse 对象中设置 Content-Type的主要内容,如果未能解决你的问题,请参考以下文章
Shopify - 使用 Shopify API 的新订单 - 如何了解税费和运费?
Shopify:在 JavaScript 中获取当前登录的用户 ID