2012-04-02 36 views
5

Muốn nhắc trình duyệt lưu csv bằng pyramid.response.Response tìm kiếm manh mối và tìm thấy đây là a link Câu trả lời Django nhưng tôi không thể sử dụng nó với mã kim tự tháp wsgi của tôi trông như sau:Muốn nhắc trình duyệt lưu 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 

Trả lời

9

Hãy thử thêm Content-Disposition:

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

++ HTTP 101 FTW –

3

Nó tốt hơn để thiết lập kiểu nội dung cũng

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

Không phải là nó những gì OP của mã đã thực hiện để đáp ứng = Response (content_type = 'text/csv')? – BluesRockAddict

+0

Tôi không làm việc mà không có điều này. Nó sẽ hiển thị hộp thoại tải xuống với tất cả thông tin của tôi, nhưng nói rằng tôi đang tải xuống tệp HTML. –

15

Như một cách sạch hơn để làm điều đó, bạn có thể đăng ký một trình kết xuất đồ họa.

Trong cấu hình của bạn thiết lập, thêm:

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

sau đó trong mypackage/renderers.py:

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

Sau đó, bạn có thể trang trí nhìn của bạn với các renderer:

@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 
      } 

Ưu điểm của phương pháp này là mã xem có thể kiểm tra tốt hơn (bạn chỉ cần kiểm tra giá trị từ điển s, không cần phải phân tích bất cứ điều gì) và bạn cũng có thể thêm một XLS hoặc bất cứ điều gì renderer đến quan điểm tương tự:

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

+1 để kiểm tra! –

Các vấn đề liên quan