我想管理員用戶能夠附加與我的模型相關的私人任意文件共享點。由於Django主要用作發佈平臺,迄今爲止我發現的所有示例都將文件上載到靜態目錄,並在其中公開訪問。我如何允許管理員上傳與他們相關的模型具有相同權限的文件?Django私人文件上傳
1
A
回答
1
我認爲最強大的方式來做到這一點正在寫一custom file storage
這是沒有那麼困難(但可能是矯枉過正滿足您的需求)。然後,你可以自定義存儲綁定到你的模型是這樣的:
from django.db import models
from django.db.models.fields.files import FileField
from myapp.storage import MyCustomStorage
class MyModel(models.Model):
path = FileField(... , storage=MyCustomStorage(), blank=False)
然後,您可以在您的自定義存儲類的業務邏輯。這樣做,您可以將私人文件存儲在本地文件系統,數據庫或遠程系統(如Google AppEngine)中。
乾杯!
2
你可以做的是在你的web服務器中設置一個特定的位置,只分類爲內部的,在你的Django應用程序中的業務邏輯將發送一個帶有特定標題的重定向,這將允許你的web服務器提供文件靜態。我以前在Nginx上使用X-Accel-Redirect來做這件事,所以我打算使用它作爲我的例子,但是我相信Apache2和其他Web服務器(X-Sendfile,我想呢?)有相同的功能。 。
在你的Nginx配置,建立,供應在您上傳您的訪問被保護文件的目錄位置:
location /protected/ {
internal;
alias /var/www-priv/;
}
文件放在這個目錄將無法訪問外部的的URL /保護/ {filepath},但是如果您從頭文件X-Accel-Redirect =/protected/{filepath}返回Django應用程序的響應。
使用像/ media/{filepath}這樣的URL創建視圖,在該視圖中執行必要的業務邏輯以控制對其的訪問(您可能希望使路徑參數稍微更詳細,以便可以捕獲應用程序標籤,其中文件被附加訪問控制例如/媒體/ {app_label}/{模型}/{的object_id}/{文件名})
的目的模型和對象ID您然後只是做
response = HttpResponse()
response['X-Accel-Redirect'] = "/protected" + filepath
return response
和Bob的叔叔 - 用戶將被提供受保護的文件。