2015-11-25 59 views
2

讓我先說我在這方面花了很多精力,任何投入對我來說都非常有價值。現在,我的問題:使用Django:如何提供文件下載?

我有什麼工作:我的網站提供了一個簡單的界面,供用戶上傳文件,他們將被給予一個關鍵。該文件被保存到服務器,密鑰是使用現代,安全的加密算法生成的。這些細節對於手頭的問題並不重要。

我想實現的內容:在下載頁面上,用戶可以輸入密鑰並將文件下載到他們的計算機上。想要知道的是如何爲用戶提供下載上傳文件的能力。簡而言之,我只想讓用戶在MEDIA_ROOT文件夾下載一個文件。

我使用基於類的意見,所以我的網址是:

urls.py

from django.conf.urls import patterns, include, url 
from django.conf.urls.static import static 
from django.conf import settings 
from fileupload.views import FileDownloadView, GetFileView 

urlpatterns = patterns('', 
    url(r'^key/?$', FileDownloadView.as_view(), name='getkey'), 
    url(r'^download/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT}, GetFileView.as_view()), 
) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 

請爲我提供,我應該在我的觀點使用何種功能的基本思路實際上下載文件。我仍在開發中,所以我想利用Django提供文件的能力,而不是Apache的。如果我投入生產,我會考慮其他選擇。無論我需要發佈什麼代碼,我都可以發佈。

謝謝!

+0

爲什麼不使用nginx來處理所有靜態文件? –

+0

你好,我很抱歉,我忘了提及我正在使用Apache。我添加了一個編輯來闡明我想利用Django提供文件的能力。 – Chuck

回答

1

如果密鑰授予他們訪問文件的權限,爲什麼不把密鑰設置爲文件名?也就是說,當文件上傳時,創建一個長鍵(比如說64個字符)並將文件重命名爲鍵名。當請求時,只需使用static.serve方法提供該文件即可。

這種方法的好處是:1)您不需要將密鑰映射到數據庫中的文件,以及2)在檢索文件時不需要驗證密鑰。如果找到文件名,則密鑰有效。

+0

嗨布倫特, 我絕對是這樣做的!它確實使這個過程變得更容易。我不知道的是如何使用這個static.serve方法來提供文件。你能提供一個如何使用這個函數的例子嗎?謝謝。 – Chuck

+0

也許這將幫助:http://stackoverflow.com/a/9825550/584846 –

+0

我以前找到這篇文章,並已相應地設置了一切,但是,該文章是缺少什麼方法,我需要使用我的信息觀點。 – Chuck

0

基本上我告訴過你,Django不應該在生產中提供文件。是

後,它可能是:

你可以成爲一個文件樹django.conf.urls.static.static(),如您urls.py視圖。例如:

urlpatterns = patterns('', 
    ... 
    static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 
    ... 
) 

或者使用whitenoise,一包與Python Web應用程序服務器的靜態文件。這是非常簡單易用,只改變你的wsgi.py文件是這樣的:

from django.core.wsgi import get_wsgi_application 
from whitenoise.django import DjangoWhiteNoise 

application = get_wsgi_application() 
application = DjangoWhiteNoise(application) 

而且使用'whitenoise.django.GzipManifestStaticFilesStorage'STATICFILES_STORAGE

0

隨着我在原來的問題顯示的URL文件,所有我需要在這裏做的是提供一個HttpResponseRedirect(「/路徑/ /我的/媒體/文件」)

很簡單!