0

I have a download to Excel button on a page whose intent is to call the exact same URL, but with the Request Header set to "application/ms-excel".

Currently, I am faking it, by calling another URL, then adjusting the headers and then forwarding to the same function.

Server-side (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)

My problem is that I don't want to maintain a custom URL just for Excel (or adding an optional /xls/ to the regex for the url. Perfectly OK using the existing url, and having the server adjust on the basis of the accepts headers. And, yes, I could add query parameter to indicate xls, but... isn't my particular requirement what accept headers are for?

I found a discussion about how to do this in Ajax, but that's not necessary here. Perfectly happy with a regular GET (not POST) request that happens to specify application/ms-excel.

I know I can't specify the accepts using the href attribute. And, while window.open() in javascript would do the trick just fine, I don't see any way to change the accept headers there either.

Hmmm, yes, may be a web noob question, but I can't find much about easily modifying accept headers outside of $http or $ajax trickery.

Community
  • 1
  • 1
JL Peyret
  • 10,917
  • 2
  • 54
  • 73

0 Answers0