คุณควรใช้ sendfile apis ที่กำหนดโดยเซิร์ฟเวอร์ยอดนิยมเช่นapache
หรือnginx
ในการผลิต หลายปีที่ฉันใช้ sendfile api ของเซิร์ฟเวอร์เหล่านี้เพื่อป้องกันไฟล์ จากนั้นสร้างมิดเดิลแวร์ที่เรียบง่ายตาม Django app สำหรับวัตถุประสงค์นี้เหมาะสำหรับทั้งการพัฒนาและการผลิต purpose.You สามารถเข้าถึงรหัสที่มาที่นี่
ปรับปรุง: ในpython
ผู้ให้บริการรุ่นใหม่ใช้ django FileResponse
ถ้ามีและยังเพิ่มการสนับสนุนสำหรับการใช้งานเซิร์ฟเวอร์จำนวนมากจาก lighthttp, แคดดี้ไป hiawatha
การใช้
pip install django-fileprovider
- เพิ่ม
fileprovider
แอพในINSTALLED_APPS
การตั้งค่า
- เพิ่ม
fileprovider.middleware.FileProviderMiddleware
การMIDDLEWARE_CLASSES
ตั้งค่า
- ตั้ง
FILEPROVIDER_NAME
ค่าการตั้งค่าเป็นnginx
หรือapache
กำลังการผลิตตามค่าเริ่มต้นpython
เพื่อการพัฒนา
ในมุมมอง classbased หรือฟังก์ชั่นของคุณตั้งค่าการตอบสนองส่วนหัวX-File
เพื่อเส้นทางที่แน่นอนไปยังไฟล์ ตัวอย่างเช่น,
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
impemented ในทางที่รหัสของคุณจะต้องมีการปรับเปลี่ยนขั้นต่ำเท่านั้น
การกำหนดค่า Nginx
เพื่อป้องกันไฟล์จากการเข้าถึงโดยตรงคุณสามารถตั้งค่าเป็น
location /files/ {
internal;
root /home/sideffect0/secret_files/;
}
ต่อไปนี้nginx
เป็นการตั้งค่า URL ตำแหน่ง/files/
การเข้าถึงเฉพาะภายในถ้าคุณใช้การกำหนดค่าข้างต้นคุณสามารถตั้งค่า X-File เป็น
response['X-File'] = '/files/filename.extension'
เมื่อทำสิ่งนี้กับการกำหนดค่า nginx ไฟล์จะได้รับการปกป้องและคุณสามารถควบคุมไฟล์จาก django ได้ views