คุณควรใช้ 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