0

我在页面上有一个下载到 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 诡计之外的接受标头的内容。

4

0 回答 0