Django MEDIA_URLおよびMEDIA_ROOT


229

Django管理を介して画像をアップロードし、フロントエンドのページまたはURLを介してその画像を表示しようとしています。

これはすべて私のローカルマシン上にあることに注意してください。

私の設定は次のとおりです:

MEDIA_ROOT = '/home/dan/mysite/media/'

MEDIA_URL = '/media/'

upload_toパラメータを「images」に設定し、ファイルがディレクトリに正しくアップロードされました。

'/home/dan/mysite/media/images/myimage.png'

ただし、次のURLにある画像にアクセスしようとすると、

http://127.0.0.1:8000/media/images/myimage.png

404エラーが発生します。

アップロードしたメディアに特定のURLconfパターンを設定する必要がありますか?

助言をいただければ幸いです。

ありがとう。

回答:


293

Djangoのアップデート> = 1.7

Django 2.1ドキュメントごと:開発中にユーザーがアップロードしたファイルを提供する

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = patterns('',
    # ... the rest of your URLconf goes here ...
) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

if settings.DEBUGDjangoがデバッグモードでのみ使用されるようにするため、Djangoが処理するため、もう必要ありません。


Djangoの元の回答<= 1.6

これをurls.pyに入れてみてください

from django.conf import settings

# ... your normal urlpatterns here

if settings.DEBUG:
    # static files (images, css, javascript, etc.)
    urlpatterns += patterns('',
        (r'^media/(?P<path>.*)$', 'django.views.static.serve', {
        'document_root': settings.MEDIA_ROOT}))

これにより、Djangoから静的メディアを提供できますDEBUG = True(ローカルコンピューターで実行している場合)。DEBUG = False


14
PS。これをテンプレートで使用できます:<img src = "{{MEDIA_URL}} images / myimage.png" />
Micah Carrick

^media//(?P<path>.*)$に記号を追加するのは良いことではないと思います。時々、アプリのURLパス(などhttp://127.0.0.1:8000/myapp/media/img/logo.png)のメディアファイルにアクセスするとき、このレギュラーは計算できません。
Jack Zhang

画像が404を返すのはなぜか、2日間も苦労してきました。これが欠けている唯一の問題であり、Djangoドキュメントで見つけることができません。ありがとう。
タンバロロ2013

1
Django 1.5以降を使用している場合は、以下の回答をご覧ください。それはより良い解決策です。
Thane Brimhall

これはアプリまたはプロジェクトのurls.pyにありますか?
user7804781 2018

105

Djangoの公式DOCを注意深く読んでください。最も適切な答えが見つかります。

これを解決する最善かつ簡単な方法は以下のとおりです。

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = patterns('',
    # ... the rest of your URLconf goes here ...
) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

1
これは、Djangoの1.5で追加された新機能です
codeVerine

Apacheを使用した本番環境でこの方法を使用しても大丈夫ですか?
アンディラブス2014年

1
@andi-いいえ、この方法で本番環境で使用することはできません。本番環境では、Apacheを介して構成する必要があります。
Vikas Gulati


1
しかし、このコードはif settings.DEV自動的に無効になるため、チェックなしで本番環境に残しておいても問題ありませんか?
jozxyqk 2015年

70

Django 1.9の場合、ドキュメントに従って次のコードを追加する必要があります。

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    # ... the rest of your URLconf goes here ...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

詳細については、こちらを参照してください。https//docs.djangoproject.com/en/1.9/howto/static-files/#serving-files-uploaded-by-a-user-during-development


2
これは、django> 1.9、thnksのソリューションです。
unixeO 2016年

13
これを、アプリではなくプロジェクトのurls.pyに挿入してください。
ヤルノ

3
1.10でも私のために働きました。
2016

私にはうまくいきません。おそらく、settings.pyに必要な基本設定がありますか?
Fusion

25

ここで私がDjango 2.0で行ったこと。最初のMEDIA_ROOTにMEDIA_URLを設定setting.py

MEDIA_ROOT = os.path.join(BASE_DIR, 'data/') # 'data' is my media folder
MEDIA_URL = '/media/'

そして、有効media context_processorsTEMPLATE_CONTEXT_PROCESSORS加えることにより、

TEMPLATES = [
{
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': [],
    'APP_DIRS': True,
    'OPTIONS': {
        'context_processors': [
            #here add your context Processors
            'django.template.context_processors.media',
        ],
    },
},
]

あなたの media context processorISは今、すべてが、有効なRequestContext変数が含まれていますMEDIA_URL

これで、これにアクセスできます template_name.html

<p><img src="{{ MEDIA_URL }}/image_001.jpeg"/></p>

素晴らしく説明されました-これが私にとっての答えでした。重要なのは、メディアコンテキストプロセッサを追加することでした。
David Maness

23

アップロードしたメディアに特定のURLconfパターンを設定する必要がありますか?

はい。開発の場合、これをURLconfに追加するのと同じくらい簡単です。

if settings.DEBUG:
    urlpatterns += patterns('django.views.static',
        (r'media/(?P<path>.*)', 'serve', {'document_root': settings.MEDIA_ROOT}),
    )

ただし、本番環境では、Apache、lighttpd、nginx、または任意のWebサーバーを使用してメディアを提供する必要があります。


3
それはどうやってサーバーを構成するのですか?
M Hornbacher 2017

「パターン」への未解決の参照を取得しましたが、それはどこからインポートされたのですか?
user7804781 2018

6

(少なくとも)Django 1.8の場合:

使用する場合

if settings.DEBUG:
  urlpatterns.append(url(r'^media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT}))

上記のように、urlpatterns = []の前に、デフォルトのビューへの「すべてをキャッチ」するURLパターンがないことを確認してください。.appendは追加されたスキームをリストの最後に配置するため、もちろん、以前のURLパターンが一致しない場合にのみテストされます。これを回避するには、ifステートメントとは別に、「catch all」URLパターンが最後に追加される次のようなものを使用します。

if settings.DEBUG:
    urlpatterns.append(url(r'^media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT}))

urlpatterns.append(url(r'$', 'views.home', name='home')),

6

Django 1.10.6を使用して、django-publicationsアプリ用のPDFを配信するために私が行わなければならない変更は次のとおりです。

次のように、メディアディレクトリに同じ定義を使用しましたsettings.py

MEDIA_ROOT = '/home/user/mysite/media/'

MEDIA_URL = '/media/'

@thisisashwanipandeyがプロジェクトのメインで提供しているようにurls.py

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    # ... the rest of your URLconf goes here ...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

@ r-allelaが提供する回答の修正settings.py

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                # ... the rest of your context_processors goes here ...
                'django.template.context_processors.media',
            ],
         },
    },
]

4

すべてのURLconfパターンを設定した後に直面する可能性が高いもう1つの問題は、変数{{ MEDIA_URL }}がテンプレートで機能しないことです。これを修正するには、settings.pyで、必ず追加してください

django.core.context_processors.media

あなたのTEMPLATE_CONTEXT_PROCESSORS


2

django 1.8のMicah Carrick回答に追加:

if settings.DEBUG:
  urlpatterns.append(url(r'^media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT}))

1
私(1.10)では機能しません。TypeError: view must be a callable or a list/tuple in the case of include().
2016

2

これは、Django 1.11を使用するPython 3.6でDEBUG = Falseモードで画像レンダリングを実現するために行ったものです

from django.views.static import serve
urlpatterns = [
url(r'^media/(?P<path>.*)$', serve,{'document_root': settings.MEDIA_ROOT}),
# other paths
]

2

上記のデバッグモードの=> 3.0の手順に従う

urlpatterns = [
...
]
+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

そして、私を見つけた部分、上記の静的URLは私のメインプロジェクトのurls.pyファイルでのみ機能しました。私は最初にアプリに追加しようとしましたが、なぜ画像が表示されないのかと思っていました。

最後に、次の設定を確認してください。

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


0

あなたの設定は大丈夫です。一部のWebサーバーでは、メディアおよび静的フォルダーファイルを具体的に指定する必要があります。たとえばpythonanywhere.comでは、「Web」セクションに移動して、メディアフォルダーと静的フォルダーのURLを追加する必要があります。例えば:

  URL                     Directory                
/static/            /home/Saidmamad/discoverthepamirs/static     
/accounts/static/   /home/Saidmamad/discoverthepamirs/accounts/static    
/media/            /home/Saidmamad/discoverthepamirs/discoverthepamirs/media    

私はそれが遅いことを知っていますが、同じ問題のためにこのリンクを訪れる人々を助けるためだけです;)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.