2013-04-11 75 views
1

我想管理員用戶能夠附加與我的模型相關的私人任意文件共享點。由於Django主要用作發佈平臺,迄今爲止我發現的所有示例都將文件上載到靜態目錄,並在其中公開訪問。我如何允許管理員上傳與他們相關的模型具有相同權限的文件?Django私人文件上傳

回答

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的叔叔 - 用戶將被提供受保護的文件。