2010-09-30 13 views
5

Tôi có một trang web cho phép người dùng tải xuống một số tệp nhất định. Tuy nhiên, tôi muốn giữ số lượng tải xuống cho mỗi tệp để đi theo cách thông thường bằng cách đặt các tệp tĩnh trên một tên miền phụ khác và sau đó cho phép apache thực hiện việc nâng hạng nặng không phải là cách cũng như HttpResponseRedirecting người dùng đến một tên miền phụ không tốt bởi vì sau đó người dùng 'thấy' url tải xuống thích hợp và do đó có thể tải xuống tệp mà không tăng số lượt tải xuống. Tôi chỉ có thể xây dựng một cái nhìn mà sau đó phục vụ() của tập tin tuy nhiên tôi lo lắng về điều đó "big fat disclaimer". Làm thế nào bạn/bạn đã thực hiện điều này? Tôi khá shure tôi không phải là người duy nhất với vấn đề đó.Cung cấp các tệp tĩnh có logic trong django (giữ số lượt tải xuống)

Giới thiệu về nền tảng: Tôi đang sử dụng apache và mod_wsgi.

Cảm ơn bạn

Trả lời

1

Câu trả lời của psj chắc chắn là một lựa chọn khả thi. Một tùy chọn khác mà bạn nên điều tra là đặt một máy chủ proxy ngược vào trước apache như Perlbal hỗ trợ tiêu đề "X-REPROXY-URL".

Khi bạn có máy chủ proxy ngược tại chỗ, thay vì gửi cho người dùng phản hồi chuyển hướng, bạn có thể gửi phản hồi với tiêu đề "X-REPROXY-URL" được đặt thành URL nơi máy chủ proxy có thể truy cập người dùng không thể. Sau đó, máy chủ proxy sẽ đọc trong tệp từ vị trí bạn đã gửi trong tiêu đề và sau đó phân phối nó cho khách hàng của bạn. Họ sẽ làm như vậy một cách hiệu quả và vì tất cả các máy chủ ứng dụng Django của bạn cần gửi là một phản ứng với một bộ tiêu đề, nó là miễn phí để xử lý một yêu cầu khác.

0

Tôi đã làm điều này với bộ đếm django cách đây không lâu. Cho phép bạn theo dõi số lượng trong quản trị viên. http://github.com/svetlyak40wt/django-counter/

+0

tôi đã hy vọng cho một câu trả lời chung hơn kể từ khi giữ số lượt tải xuống sẽ không phải là logic duy nhất xảy ra :) – niklasfi

5

Chúng tôi đã triển khai hệ thống mà chúng tôi cần kiểm soát quyền truy cập tải xuống các tệp tĩnh (lớn), tự nhiên không muốn Django tự phục vụ. Chúng tôi đã đưa ra một kế hoạch, theo đó ứng dụng Django, sau khi xác nhận rằng người dùng được phép tải xuống tệp (hoặc tăng bộ đếm, trong trường hợp của bạn), chúng tôi sẽ tạo một liên kết ngẫu nhiên được đặt tên cho tệp mà Apache có quyền truy cập (hãy cẩn thận: đảm bảo rằng việc lập chỉ mục thư mục bị tắt vv), và sau đó chuyển hướng người dùng đến liên kết tượng trưng đó được Apache phục vụ.

Chúng tôi có một "dọn dẹp" cronjob làm sạch liên kết tượng trưng sau khi chúng được tạo ra, vì vậy nếu họ muốn tải xuống lại, họ phải đi qua Django và tính lại. Bây giờ, về mặt lý thuyết, họ có thể tải xuống nhiều lần trong thời gian đó, nhưng điều đó có khả năng xảy ra không? Bạn có thể dọn dẹp nhiều hơn mỗi phút: Apache chỉ cần có liên kết tượng trưng để tồn tại ở phần đầu của quá trình tải xuống, chứ không phải trong toàn bộ vấn đề.

Tôi tò mò muốn biết người khác giải quyết vấn đề này như thế nào, vì tôi đồng ý với OP rằng đó là một tình huống phổ biến.

+0

điều này nghe có vẻ như một ý tưởng hay, nhưng tôi muốn giữ thiết kế url phong nha và cho phép người dùng tải xuống một tệp hai lần từ cùng một vị trí – niklasfi

+0

Chắc chắn, nhưng mô hình này vẫn hỗ trợ điều đó. URL chuẩn cho tệp là URL được kiểm soát bởi Django, URL phù hợp và phong nha, và URL duy nhất mà người dùng nhìn thấy. Chuyển hướng đến liên kết tượng trưng do Apache cung cấp là một "chi tiết hệ thống ống nước" mà người dùng không nhận thấy - trình duyệt theo dõi chuyển hướng một cách minh bạch. – psj