2017-06-12 1 views
0

Je prends queryset tournant dans le fichier csv, je reçois même la réponse. Mais le navigateur ne télécharge pas le fichier csv renvoyé. Je suis sur le chrome. Lorsque j'appelle la route de rapport, j'obtiens le texte formaté csv dans ma réponse. Mais cela ne déclenche pas le téléchargement.Django HttpResponse générer csv mais ne pas le télécharger

Voici ma demande de réagir:

this.getReport = (format="json") => { 
     this.setState({btnDisabled: true}); 
     const requestObj = { 
      method: 'GET', 
      headers: { 
       'Authorization': 'Token ' + this.props.session_token, 
       'Content-Type': 'application/json', 
      } 
     }; 

     const uri = new URI(`${API_ENDPOINT}/email-campaign/report`); 
     const campaigns = this.state.campaignList.map((campaign)=>(
      campaign.value 
     )); 
     uri.setSearch({ 
      campaigns: [campaigns], 
      date_from: stringToDateISOString(this.state.dateFrom), 
      date_to: stringToDateISOString(this.state.dateTo), 
      data_format: format, 
     }); 
     return fetch(uri.toString(), requestObj).then(restJSONResponseToPromise).then(responseJSON => { 
      if (responseJSON.results){ 
       this.setState({report: responseJSON.results, btnDisabled: false}); 
      } 
     }, (response) => { 
      clearSessionIfInvalidToken(this.props.clearSession); 
      this.setState({btnDisabled: false}); 
     }); 
    } 

têtes de réponse:

HTTP/1.0 200 OK

Date: 12 juin 2017 19:58:03 GMT

Serveur: WSGIServer/0.2 CPython/3.5.3

Type de contenu: text/csv

X-Frame-Options: SAMEORIGIN

Access-Control-Allow-origine: http://localhost:3000

Variez: Accepter, Origine

Autoriser: GET, OPTIONS

Content-Disposition: attachement; filename = emailcampaign_export.csv;

Cache-Control: no-cache

+0

Votre mixin semble correct. Où 'data_format' est-il défini dans votre vue? Êtes-vous sûr que ce n'est pas une erreur? – Brobin

+0

Je ne suis pas erreur, j'ai oublié d'inclure cette ligne dans la question. J'ai obtenu une réponse http de 200, avec le csv attendu sur le corps de la réponse. C'est juste le fichier qui n'est pas téléchargé dans mon système. –

+0

Est-ce que la réponse http a un en-tête Content-Disposition? https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition –

Répondre

0

Essayez ceci:

from cStringIO import StringIO 

def render_to_csv(self, queryset): 
    file_io = StringIO() 
    headers = queryset[0].keys() 
    dict_writer = csv.DictWriter(file_io, fieldnames=headers) 
    dict_writer.writeheader() 
    dict_writer.writerows(queryset) 
    response = HttpResponse(file_io.getvalue(), content_type='text/csv') 
    file_io.close() 
    cd = 'attachment; filename="{0}"'.format(self.get_csv_filename()) 
    response['Content-Disposition'] = cd 
    return response