2017-06-12 18 views
0

私はquerysetをcsvファイルに変換しています。しかし、ブラウザは返されたcsvファイルをダウンロードしていません。私はクロムです。Django HttpResponse csvを生成していますが、ダウンロードしていません

class CSVMixin(object): 
csv_filename = 'csvfile.csv' 

def get_csv_filename(self): 
    return self.csv_filename 

def render_to_csv(self, queryset): 
    response = HttpResponse(content_type='text/csv') 
    cd = 'attachment; filename="{0}"'.format(self.get_csv_filename()) 
    response['Content-Disposition'] = cd 

    headers = queryset[0].keys() 
    dict_writer = csv.DictWriter(response, fieldnames=headers) 

    dict_writer.writeheader() 
    dict_writer.writerows(queryset) 
    return response 

class EmailCampaignViewSet(CSVMixin, OrionAdminModelViewset): 
    queryset = MyObject.objects.all() 

    pagination_class = DefaultLimitOffsetPagination 
    filter_class = EmailCampaignFilter 

    @list_route() 
    def report(self, request): 
     query = self.request.query_params 
     data_format = query['data_format'] if query['data_format'] else None 

     if data_format == 'csv': 
      return self.render_to_csv(queryset) 

レポートルートを呼び出すと、応答の中にcsv形式のテキストが表示されます。しかし、それはダウンロードを誘発していません。ここで

は反応するから私の要求です:

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}); 
     }); 
    } 

レスポンスヘッダ:

HTTP/1.0 200 OK

日:月、2017年6月12日夜七時58分03秒GMT

サーバー:WSGIServer/0.2 CPython/3.5.3

コンテンツタイプ:text/csv

X-フレーム・オプション:SAMEORIGIN

アクセス制御が許原産地:http://localhost:3000

ヴァリ:、原産地

を受け入れ

許可:GET、OPTIONS

コンテンツディスポジション:アタッチメント; filename = emailcampaign_export.csv;

のCache-Control:キャッシュなし

+0

あなたのミックスインが正しく見えます。あなたのビューに 'data_format'がどこに定義されていますか?あなたはそれが誤りではないと確信していますか? – Brobin

+0

私は誤りではない、私は質問にその行を含めることを忘れていた。私はレスポンスボディに期待されるcsvと共に、200のhttpレスポンスを得ました。そのファイルは私のシステムにダウンロードされていません。 –

+0

http応答にContent-Dispositionヘッダーがありますか? https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition –

答えて

0

はこれを試してみてください:

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 
関連する問題