2014-10-07 102 views
1

我使用Amazon S3作爲我的web服務的一部分。工作流程如下:本地文件系統作爲Django中的遠程存儲

  • 用戶上傳大量文件到網絡服務器。 Web服務器第一把它們存儲在本地,然後上傳到S3異步
  • 用戶發送HTTP請求來啓動工作(這是這些上傳的文件進行一些處理)
  • Web服務要求職工辦
  • 工人做的工作工作和上傳結果到S3
  • 用戶請求從Web服務器下載鏈接,somedbrecord.result_file.url返回使用這個鏈接

要處理文件

  • 用戶下載導致我用QueuedStorage後端。我開始我的FileFields這樣的:

    user_uploaded_file = models.FileField(..., storage=queued_s3storage, ...) 
        result_file = models.FileField(..., storage=queued_s3storage, ...) 
    

    哪裏queued_s3storage...backends.QueuedStorageremote場派生類對象設置爲'...backends.s3boto.S3BotoStorage'

    現在我打算在一臺機器上部署整個系統以在本地運行所有內容,我想用基於本地文件系統的東西替換這個'...backends.s3boto.S3BotoStorage'

    第一個解決方法是使用可以在本地「模擬」S3的FakeS3。工程,但這不是理想的,只是額外的不必要的開銷。

    我有Nginx服務器運行並提供來自特定目錄的靜態文件。如何創建實際存儲本地文件的「遠程存儲」類,但是提供了導致Nginx提供的文件的下載鏈接? (如http://myip:80/filedir/file1)。在django中有沒有標準的庫類?

  • 回答

    4

    媒體文件的默認存儲後端爲本地存儲。

    settings.py定義了這兩個環境變量:

    • MEDIA_ROOT(link to docs) - 這是本地文件存儲文件夾的絕對路徑
    • MEDIA_URL(link to docs) - 這是Web服務器的HTTP路徑(例如'/media/''//%s/media' % HOSTNAME

    這些默認存儲後端用於保存媒體文件。從Django的默認/ gl 10:28 settings.py

    # Default file storage mechanism that holds media. 
    DEFAULT_FILE_STORAGE = 'django.core.files.storage.FileSystemStorage' 
    

    此配置默認存儲在FileFields使用提供了一種用於其中沒有存儲kwarg。它也可以這樣訪問:rom django.core.files.storage import default_storage


    所以,如果你想改變的地方發展和生產使用的存儲空間,可以做這樣的事情:

    # file_storages.py 
    from django.conf import settings 
    from django.core.files.storage import default_storage 
    from whatever.backends.s3boto import S3BotoStorage 
    
    app_storage = None 
    if settings.DEBUG == True: 
        app_storage = default_storage 
    else: 
        app_storage = S3BotoStorage() 
    

    而在你的機型:

    # models.py 
    from file_storages import app_storage 
    
    # ... 
        result_file = models.FileField(..., storage=app_storage, ...) 
    

    最後,你想讓nginx直接從你的MEDIA_URL提供文件。只要確保nginx網址與MEDIA_URL中的路徑相匹配即可。

    +0

    謝謝! MEDIA_URL是我正在尋找的 – 2014-10-07 14:14:08

    +0

    您提到的HOSTNAME是嵌入在django中的東西嗎?或者是我在settings.py中指定的自己的變量? – 2014-10-07 14:23:44

    +1

    你自己的變量。 – pztrick 2014-10-07 14:25:19

    相關問題