2015-06-26 10 views
15

Ich versuche, meine Django-App auf Heroku bereitzustellen. Alle statischen Dateien werden von whitenoise bereitgestellt und erfolgreich migriert. Aber wie bekomme ich meine Mediendateien, die mit ImageField hochgeladen werden, während der Produktion anzuzeigen.Serving Media-Dateien während der Bereitstellung in Django 1.8

mein settings.py

STATIC_URL = '/static/' 
STATIC_ROOT = 'C:/Users/Sak/mpro/feat/static/' 
STATICFILES_STORAGE = 'whitenoise.django.GzipManifestStaticFilesStorage' 
MEDIA_URL = '/media/' 
MEDIA_ROOT = os.path.join(BASE_DIR, "media") 

wsgi.py

import os 

from django.core.wsgi import get_wsgi_application 

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mpro.settings") 

application = get_wsgi_application() 

try: 
    from django.core.wsgi import get_wsgi_application 
    from whitenoise.django import DjangoWhiteNoise 
    application = get_wsgi_application() 
    application = DjangoWhiteNoise(application) 
    from dj_static import Cling 
    application = Cling(get_wsgi_application()) 
except: 
    pass 

urls.py

urlpatterns = [ 
url(r'^', include('feat.urls', namespace="feat")), 
url(r'^admin/', include(admin.site.urls)), 
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 

Alle meine Mediendateien base_dir/media/media hochgeladen werden und wenn whitenoise statische Dateien speichert es sammelt nur Dateien an STATIC_ROOT, wie bekomme ich meine Mediendateien bereitgestellt. Wenn ich rufe heroku run ls kann ich den Ordner Medien sehen.

+2

Nun, Dateien in Medien sollen Laufzeitdaten sein, die mit den Daten in der Datenbank verknüpft sind, so dass sie nicht kopiert werden, genauso wie sie Daten nicht aus der Datenbank kopieren. Ich nehme an, Sie könnten Fixtures verwenden, wenn Sie einige Anfangsdaten benötigen. Sonst bist du ziemlich alleine, glaube ich. – spectras

+0

Ich verstehe, dass sie nicht auf die gleiche Weise wie statische Dateien kopiert werden, aber es muss eine Möglichkeit geben, Medienbilder hinzuzufügen. Kann auch nach der Produktion sein, wenn ich neue Bilder in meinem Admin hinzufügen möchte, muss es eine Möglichkeit geben, es irgendwo zu speichern, so dass sie auch kopiert werden. Kann im statischen Dateiordner sein, wo sie mit statischen Dateien – WutWut

+0

Sie kopiert werden Sie können sie entweder hochladen, was dazu führt, dass Django sie dorthin legt, oder Sie können Dateien manuell kopieren und "instance.image.path" zuweisen, um sie direkt in einem Skript anzuzeigen. Pfad sollte relativ zu 'MEDIA_ROOT' sein. – spectras

Antwort

5

Also, vor allem ist es wichtig zu erkennen, dass, wenn Sie eine Reihe von Dateien haben, die Teil Ihres Projekts sind (einschließlich Dinge wie Bilder und ähnliches) und mit diesem bereitgestellt werden, sind sie eher statische Dateien als Mediendateien im Django-Sprachgebrauch.

Mediendateien in Django sind für die Laufzeit hochgeladenen Dateien. Sie werden im Allgemeinen mit einem entsprechenden db-Eintrag wie models.ImageField(upload_to='/photos') gespeichert, aber das ist nicht unbedingt so.

Ihre Medien-Setup für Heroku falsch ist, da man sowieso nicht in ein Verzeichnis auf dem Server zu schreiben werden soll (das ist, was Sie Django erzählen mit MEDIA_ROOT = os.path.join(BASE_DIR, "media") zu tun.

Am häufigsten würden Sie stattdessen ein ... S3 Eimer für Medien auf Heroku This ist eine ziemlich umfassende Erklärung, dass Sie wahrscheinlich die wenig über CORS überspringen und für offene Berechtigungen für den Eimer gehen (je nach Anwendungsfall) die wichtigen Bits sind:

# settings.py 

# Tell django what URL to server your media from 
MEDIA_URL = "https://%s/" % AWS_S3_CUSTOM_DOMAIN 

# Tell Django to use the boto storage backend to save media files. 
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage' 

Wenn Sie S3 für statische UND Medienspeicherung verwenden möchten, erklärt der Link dies auch.

Sie könnten sich für einen ziemlich umfassenden Überblick über die AWS-Einstellungen und was sie tun, einen Blick auf this repo werfen, plus ein schön verpacktes Paket, um etwas davon für Sie zu tun.

Allgemeiner fand ich Django Herokuify außergewöhnlich nützlich für die gesamte Platte auf Heroku.