Bạn nên sử dụng apis sendfile được cung cấp bởi các máy chủ phổ biến như apachehoặc nginx
trong sản xuất. Nhiều năm tôi đã sử dụng api sendfile của các máy chủ này để bảo vệ các tập tin. Sau đó, tạo ra một ứng dụng django dựa trên phần mềm trung gian đơn giản cho mục đích này phù hợp cho cả mục đích phát triển và sản xuất. Bạn có thể truy cập mã nguồn tại đây .
CẬP NHẬT: trong phiên bản mới, pythonnhà cung cấp sử dụng django FileResponsenếu có và cũng thêm hỗ trợ cho nhiều triển khai máy chủ từ lighthttp, caddy đến hiawatha
Sử dụng
pip install django-fileprovider
- thêm
fileproviderứng dụng vào INSTALLED_APPScài đặt,
- thêm
fileprovider.middleware.FileProviderMiddlewarevào MIDDLEWARE_CLASSEScài đặt
- đặt
FILEPROVIDER_NAMEcài đặt thành nginxhoặc apachetrong sản xuất, theo mặc định, nó pythondành cho mục đích phát triển.
trong các khung nhìn lớp hoặc hàm của bạn đặt X-Filegiá trị tiêu đề phản hồi thành đường dẫn tuyệt đối đến tệp. Ví dụ,
def hello(request):
// code to check or protect the file from unauthorized access
response = HttpResponse()
response['X-File'] = '/absolute/path/to/file'
return response
django-fileprovider theo cách mà mã của bạn sẽ chỉ cần sửa đổi tối thiểu.
Cấu hình Nginx
Để bảo vệ tệp khỏi truy cập trực tiếp, bạn có thể đặt cấu hình là
location /files/ {
internal;
root /home/sideffect0/secret_files/;
}
Ở đây nginxđặt url vị trí /files/chỉ truy cập vào quốc tế, nếu bạn đang sử dụng cấu hình ở trên, bạn có thể đặt X-File là,
response['X-File'] = '/files/filename.extension'
Bằng cách thực hiện với cấu hình nginx, tệp sẽ được bảo vệ và bạn cũng có thể kiểm soát tệp từ django views