Bạn nên sử dụng apis sendfile được cung cấp bởi các máy chủ phổ biến như apache
hoặ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, python
nhà cung cấp sử dụng django FileResponse
nế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_APPS
cài đặt,
- thêm
fileprovider.middleware.FileProviderMiddleware
vào MIDDLEWARE_CLASSES
cài đặt
- đặt
FILEPROVIDER_NAME
cài đặt thành nginx
hoặc apache
trong sản xuất, theo mặc định, nó python
dà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-File
giá 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