我在页面上有一个下载到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(或者为url添加一个可选的/ xls /到正则表达式。完全可以使用现有的URL,并在服务器上调整服务器接受标题。并且,是的,我可以添加查询参数来表示xls,但是...不是我的特殊要求接受标题是什么?
我在Ajax中找到了关于如何执行此操作的discussion,但这不是必需的。非常满意于定期发出指定application / ms-excel的GET(非POST)请求。
我知道我无法使用href属性指定接受。并且,虽然javascript中的window.open()可以正常使用,我也没有看到任何方法来更改接受标头。
嗯,是的,可能是一个网络菜鸟问题,但我找不到很多关于在$ http或$ ajax trickery之外轻松修改接受标题。