我在页面上有一个下载到 Excel 按钮,其意图是调用完全相同的 URL,但请求标头设置为“application/ms-excel”。
目前,我通过调用另一个 URL,然后调整标题,然后转发到相同的函数来伪造它。
服务器端(Django):
HTTP_HEADER_EXCEL = "application/ms-excel"
#fake testing url
#http://localhost:8000/myfunction/<CLASSID>/xls/
def myfunction_xls(request, CLASSID):
#intercept request, add the appropriate accepts
#and forward it
request.META["HTTP_ACCEPT"] = HTTP_HEADER_EXCEL
request.META["dbr"] = dbr
return myfunction(request, CLASSID)
#standard url
#http://localhost:8000/myfunction/<CLASSID>/
def myfunction(request, CLASSID, f_callback=None):
if request.META["HTTP_ACCEPT"] == HTTP_HEADER_EXCEL:
f_callback=provider.generateExcel
....do lots of work...
di_context = dict(inst=inst,
parent=inst,
custom=custom,
url_excel=url_excel,
if f_callback:
#use xlsxwriter to process di_context data
#wrap up the appropriate response headers
#and it appears as a download (it works)
return f_callback(request, di_context)
#non-Excel branch, i.e. standard Django behavior
t = get_template('pssecurity/security_single.html')
c = RequestContext(
request,
di_context,
)
html = t.render(c)
return HttpResponse(html)
我的问题是我不想只为 Excel 维护自定义 URL(或添加可选 /xls/ 到 url 的正则表达式。使用现有 url 完全可以,并让服务器根据接受进行调整标头。而且,是的,我可以添加查询参数来指示 xls,但是......我的特殊要求不是接受标头的用途吗?
我找到了关于如何在 Ajax 中执行此操作的讨论,但这里没有必要。对碰巧指定 application/ms-excel 的常规 GET(而不是 POST)请求非常满意。
我知道我不能使用 href 属性指定接受。而且,虽然 javascript 中的 window.open() 可以很好地解决问题,但我也看不到任何方法可以更改接受标头。
嗯,是的,可能是一个网络菜鸟问题,但我找不到太多关于轻松修改 $http 或 $ajax 诡计之外的接受标头的内容。