簡體   English   中英

如何在生產中提供媒體文件

[英]How To Serve media Files In Production

我有一個 Django 項目,它向用戶發送帶有附加 pdf 的自動電子郵件。 目前,我只有一個普通的/media/文件夾,其中包含代碼指向的 pdf。 這在開發中有效,但在生產中引發服務器錯誤。

我的問題是如何在生產中提供media文件? 我已經閱讀了很多關於它的內容,但找不到我想要的確切內容。

我在我的生產環境中使用collectstatic用於靜態文件,我希望media文件有類似的東西。

網址

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('page.urls')),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

設置

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static_files')

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, "static_media")

views.py(發送文件)

file_path = os.path.join(settings.STATIC_ROOT+'\\pdf\\free_pdf.pdf')
...
msg.attach_file(file_path)

乘客.wsgi

import os
import sys

sys.path.append(os.getcwd())
os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'

import django.core.handlers.wsgi
from django.core.wsgi import get_wsgi_application
from whitenoise import WhiteNoise
SCRIPT_NAME = os.getcwd()
SCRIPT_NAME = '' #solution for damn link problem

class PassengerPathInfoFix(object):
    def __init__(self, app):
        self.app = app
    def __call__(self, environ, start_response):
        from urllib.parse import unquote
        environ['SCRIPT_NAME'] = SCRIPT_NAME
        request_uri = unquote(environ['REQUEST_URI'])
        script_name = unquote(environ.get('SCRIPT_NAME', ''))
        offset = request_uri.startswith(script_name) and len(environ['SCRIPT_NAME']) or 0
        environ['PATH_INFO'] = request_uri[offset:].split('?', 1)[0]
        return self.app(environ, start_response)
application = get_wsgi_application()
application = PassengerPathInfoFix(application)
application = WhiteNoise(application, root='/home/mysite/mysite/static_files')

(此代碼來自我放棄媒體文件夾並嘗試僅將其與我的靜態文件一起使用時)

我的項目結構:

|project
|__app
|__static
|  |__app
|    |__style.css
|__media
|  |__app
|     |__pdfToBeSent
|__static_files (generated by collectstatic)
|__media_files (i created this)

collectstatic 也不media_files我的項目媒體文件復制到media_files ,我自己一直在將它們復制到其中(對此不確定)。

我還嘗試將媒體文件移動到我項目中的每個可能位置

我還使用白噪聲為我的靜態文件提供服務。

謝謝你。

由於我處於類似的情況(在同一主機上,A2Hosting),我將嘗試分享我對問題的理解以及我選擇的解決方案。

請原諒我在本次演示中可能顯得冒昧,我只是試圖追溯所有代表引導我找到這個解決方案的思想流的觀點。

一個小前提:如果使用“媒體文件”,您打算使用多媒體文件,例如圖像等,我認為您不應該使用 Django 媒體文件夾,因為它旨在為用戶上傳的文件提供服務。
不知道您的 PDF 是否確實是由某個用戶上傳的,無論如何我都會嘗試公開我的解決方案。

在生產環境中,Django 不會提供靜態和媒體文件。
對於前者,我也使用 WhiteNoise,而對於后者,方法不同(至少在共享主機基礎上)。

當我們在settings.py 中設置Debug = False 時,我懷疑與 Django 項目一起創建的媒體文件夾變得有些不可讀/無法訪問(我不知道是 Django 的手還是托管的手,還是結合兩者中)。

官方處理媒體文件的方法確實是依賴外部存儲服務(如 Amazon S3),但這種解決方案不適合預算有限的場景。

在我的情況下,我讓 Django 應用程序在與我的主域相關的子域上運行。
主域: www.mydomain.com
應用域: subdomain.mydomain.com

將使用 Django 項目創建的媒體文件夾留在原處,我在以下 unix 路徑中創建了另一個:
/home/A2hosting_username/subdomain.mydomain.com/media

然后,在settings.py 中,我將 MEDIA_ROOT 變量從:

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

到:

MEDIA_ROOT = '/home/A2hosting_username/subdomain.mydomain.com/media'

之后,在用於定義數據庫並與之交互的model.py類中,我以這種方式指定了上傳媒體(在我的情況下為視頻)的路徑:

class Video(models.Model):
   name = models.CharField(max_length=50)
   path = models.FileField(upload_to="../media/videos", null=True, verbose_name="")

由於我們無權訪問 Apache 配置文件,因此按以下方式編輯.htaccess文件(相對於subdomain.mydomain.com )可能很有用,以防止瀏覽器在上傳文件時“超時”有點重:

<ifModule mod_headers.c>
    Header set Connection keep-alive
</ifModule>

我希望這會有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM