web-dev-qa-db-ja.com

DjangoのMEDIA_URLとMEDIA_ROOT

私は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パターンを設定する必要がありますか?

何かアドバイスは大歓迎です。

ありがとう。

200
Dan

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)

Djangoはこれがデバッグモードでのみ使用されることを保証して処理するのでif settings.DEBUGはもう必要ありません。


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}))

DEBUG = True(ローカルコンピュータで実行しているとき)の場合はDjangoから静的メディアを提供できますが、productionとDEBUG = Falseの場合はWebサーバー設定に静的メディアを提供させることができます。

254
Micah Carrick

公式の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)
99
JChen___

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 -開発

67
thisisashwani

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

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

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

ただし、制作には、Apache、lighttpd、nginx、またはご希望のWebサーバーを使用してメディアを配信します。

23
mipadi

Django 2.0でやったことsetting.pyでFirst MEDIA_ROOTをMEDIA_URLに設定

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

次に、次のように追加してcontext_processorsmediaTEMPLATE_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 processorが有効になりました。これですべてのRequestContextに変数MEDIA_URLが入ります。

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

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

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

使うなら

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

上で説明したように、デフォルトビューを対象とする "catch all" URLパターンがurlpatterns = []の前に来ないようにしてください。 .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
S. Ju.

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

Django.core.context_processors.media

あなたのTEMPLATE_CONTEXT_PROCESSORSに。

4
r_allela

Django 1.10.6を使用して Django-publications アプリ用にPDFを配信するために必要な変更は次のとおりです。

settings.pyで、あなたと同じメディアディレクトリの定義を使用しました:

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

MEDIA_URL = '/media/'

プロジェクトのメインurls.py内の@thisisashwanipandeyによって提供されているとおり:

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)

settings.py内の@ r-allelaによって提供された回答の修正。

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
Alex Willison

Django 1.8に対するMicah Carrickの回答に追加します。

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

これがDjango 1.10の場合:

 if settings.DEBUG:
    urlpatterns += staticfiles_urlpatterns()
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
1

これは私が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
]
1
comiventor

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

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

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

0
Saidmamad