2012-04-02 105 views
5

想提示瀏覽器中使用pyramid.response.Response尋找線索,發現這裏的a link Django的答案保存CSV但金字塔WSGI我的代碼看起來是這樣的,我可以不使用它:想提示瀏覽器保存CSV

from pyramid.response import Response 
def get_list_names_emails(request): 
    session, env = request.db, request.client_env 
    response = Response(content_type='text/csv') 
    output = StringIO() 
    writer = csv.writer(output) 
    writer.writerow(['SomeName', 'SomeEmail', 'CompanyName]) 
    csv_output = output.getvalue() 
    return csv_output 

回答

9

嘗試增加內容處置:

response['Content-Disposition'] = 'attachment; filename="report.csv"' 
+0

++ HTTP 101 FTW – 2012-04-02 16:55:24

3

這是更好地設置內容類型以及

response['Content-type'] = 'text/csv' 
response['Content-Disposition'] = 'attachment; filename="report.csv"' 
+0

是不是有什麼OP的代碼已經做響應=響應(CONTENT_TYPE = '文本/ CSV')? – BluesRockAddict 2012-04-02 15:51:08

+0

沒有這個,礦沒有工作。它會顯示一個包含我所有信息的下載對話框,但是說我正在下載一個HTML文件。 – 2015-07-11 01:08:36

15

作爲一種更乾淨的方法,您可以註冊一個渲染器。

在您的配置設置,添加:

config.add_renderer(name='csv', 
         factory='mypackage.renderers.CSVRenderer') 

然後在mypackage/renderers.py

@view_config(..., renderer='csv') 
def myview(self): 
    header = ['name', 'surname', 'address'] 

    rows = [ 
      (
       row['name'], 
       row['surname'], 
       row['address'], 
      ) 
     for row in query_rows(.....) 
     ] 

    return { 
      'header': header, 
      'rows': rows 
      } 

class CSVRenderer(object): 
    def __init__(self, info): 
     pass 

    def __call__(self, value, system): 
     fout = StringIO.StringIO() 
     writer = csv.writer(fout, delimiter=';', quoting=csv.QUOTE_ALL) 

     writer.writerow(value['header']) 
     writer.writerows(value['rows']) 

     resp = system['request'].response 
     resp.content_type = 'text/csv' 
     resp.content_disposition = 'attachment;filename="report.csv"' 
     return fout.getvalue() 

之後,你可以與渲染裝飾你的看法這種方法的優點是更好的可測試視圖代碼(您只需檢查字典值S,不需要解析任何東西),你還可以添加一個XLS或任何渲染到了同樣的觀點:

@view_config(..., renderer='xls') 
@view_config(..., renderer='csv') 
def myview(self): 
    ... 
+0

+1可測試性! – 2012-04-03 02:01:22