2013-01-24 27 views
19

Tôi đang viết một trang web dựa trên Django, nhưng cần phải phục vụ một tệp văn bản đơn giản. Là cách chính xác để điều này bằng cách đặt nó trong thư mục tĩnh và bỏ qua Django?Tôi làm cách nào để phân phát tệp văn bản từ Django?

+0

Có, nếu tệp là văn bản thuần túy (không có nội dung động) thì đó là chính xác. –

Trả lời

26

Nếu tệp là tĩnh (không được tạo bởi ứng dụng django) thì bạn có thể đặt tệp đó vào thư mục tĩnh.

Nếu nội dung của tệp này được tạo bởi Django thì bạn có thể trả lại trong một HttpResponse với text/plain làm mimetype.

content = 'any string generated by django' 
return HttpResponse(content, content_type='text/plain') 

Bạn cũng có thể đặt tên cho tệp bằng cách đặt Content-Disposition phản hồi.

filename = "my-file.txt" 
content = 'any string generated by django' 
response = HttpResponse(content, content_type='text/plain') 
response['Content-Disposition'] = 'attachment; filename={0}'.format(filename) 
return response 
+2

['Có một ví dụ trong tài liệu dành cho tệp PDF] (https://docs.djangoproject.com/en/dev/howto/outputting-pdf/), cho biết cách đặt mimetype không phải HTML trên Django ' HttpResponse'. –

+0

Có thể thêm tên tệp cụ thể vào tệp được tạo từ nội dung @luc ?? – chuseuiti

+0

@chuseuiti Có, tôi đã cập nhật câu trả lời của mình – luc

6

Tôi đồng ý với @luc, tuy nhiên một cách khác là sử dụng tiêu đề X-Accel-Redirect.

Hãy tưởng tượng rằng bạn phải phục vụ các tệp tĩnh được bảo vệ (phải đăng nhập để xem nó). Nếu bạn đặt tệp trong thư mục tĩnh, thì truy cập của nó sẽ mở và bất kỳ ai cũng có thể xem tệp. Nếu bạn phục vụ nó trong Django bằng cách mở tập tin và sau đó phục vụ nó, có quá nhiều IO và Django sẽ sử dụng RAM nhiều hơn vì nó có để tải các tập tin vào RAM. Giải pháp là để có một cái nhìn, mà sẽ xác thực một người dùng chống lại một cơ sở dữ liệu, tuy nhiên thay vì trả lại một tập tin, Django sẽ thêm tiêu đề X-Accel-Redirect để đáp ứng của nó. Bây giờ kể từ khi Django là đằng sau nginx, nginx sẽ thấy tiêu đề này và sau đó nó sẽ phục vụ các tập tin tĩnh được bảo vệ. Đó là tốt hơn nhiều bởi vì nginx là tốt hơn và nhiều faste lúc phục vụ các tập tin tĩnh so với Django. Here là tài liệu nginx về cách thực hiện điều đó. Bạn cũng có thể làm một điều tương tự trong Apache, tuy nhiên tôi không nhớ tiêu đề.

+0

Câu trả lời thú vị. Cảm ơn – luc

3

Tôi đã có yêu cầu tương tự để nhận mẫu văn bản cho biểu mẫu qua AJAX. Tôi chọn triển khai nó với chế độ xem dựa trên mô hình (Django 1.6.1) như sau:

from django.http import HttpResponse 
from django.views.generic import View 
from django.views.generic.detail import SingleObjectMixin 

from .models import MyModel 

class TextFieldView(SingleObjectMixin, View): 
    model = MyModel 

    def get(self, request, *args, **kwargs): 
     myinstance = self.get_object() 
     content = myinstance.render_text_content() 
     return HttpResponse(content, content_type='text/plain; charset=utf8') 

Văn bản được hiển thị khá nhỏ và được tạo động từ các trường khác trong mô hình.

+0

Giải pháp tốt và cách tuyệt vời để kiểm soát các loại tệp khác nhau. Bạn có một ví dụ 'url_patten' mục để gọi này? – nehemiah

+0

Tôi có mẫu này trong một trong các tệp url.py của tôi: 'url (r '^ showfile/(? P \ d +)/$', TextFieldView, name = 'showfile')' – jandd

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