Django如何提供媒体文件?

gri*_*igy 10 django static file

我已经设置了一个使用图像的Django应用程序.我想我已正确设置媒体设置MEDIA_ROOT和MEDIA_URL.但是图像没有显示出来.你知道可能是什么问题吗?

让我们考虑这个例子:

图像文件位于/ home/www/media/app/photos下,我们正在尝试请求http://example.com/photos/123.jpg

我应该使用这些设置吗?

MEDIA\_ROOT = /home/www/media

MEDIA_URL = http://example.com/app
Run Code Online (Sandbox Code Playgroud)

更新:忘记提到我正在使用内置开发服务器.

Gab*_*ona 13

开发人员自己不鼓励从Django提供静态内容(如果我没错,它只在调试模式下有效).您应该使用专用的Web服务器.

无论如何,如果您确实需要这样做,请阅读有关如何提供静态文件的文档.


Bry*_*ein 12

仅供开发

您可以通过在urls.py文件中执行此操作来设置静态介质服务器以与其开发服务器一起使用.我附上了显示我如何使用它的代码(以及强制DEBUG条件.)

from django.conf import settings
from django.conf.urls.defaults import *      

# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('', 
    (r'^$', 'views.index'),            

    # Accounts
    (r'^accounts/login/$', 'views.user_login'),
    (r'^accounts/logout/$', 'views.user_logout'),

    # Contrib Modules
    (r'^admin/(.*)', admin.site.root),
)

if settings.DEBUG :
    urlpatterns += patterns('',
        (r'^media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT, 'show_indexes': True}),
    )
Run Code Online (Sandbox Code Playgroud)

我把我MEDIA_ROOT放在html/media的子目录中,然后链接到它settings.py

MEDIA_ROOT = os.path.join(os.path.dirname(__file__), 'html/media/').replace('\\','/')
Run Code Online (Sandbox Code Playgroud)

开发完成后,项目将部署到Web服务器,然后Apache使用指令为静态媒体文件提供服务.


小智 9

您只需将这些行添加到您的 urls.py 中即可

from django.urls import re_path
from django.views.static import serve

urlpatterns = [
    ...
    re_path(r'^media/(?P<path>.*)$', serve,{'document_root': settings.MEDIA_ROOT}), 
    ]
Run Code Online (Sandbox Code Playgroud)


Hoj*_*esi 5

这是使用ImageField显示图像文件的正确方法。假设我们有一个用户个人资料图片:

models.py:

UserProfile:
    profilePic= models.ImageField( upload_to='PATH_TO_UPLOAD', blank=True, null=True)
Run Code Online (Sandbox Code Playgroud)

settings.py:

MEDIA_ROOT = 'FULL_PATH_OF_MEDIA'
MEDIA_URL = 'URL_OF_MEDIA'
Run Code Online (Sandbox Code Playgroud)

urls.py:

urlpatterns = [
.
.
.
]+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Run Code Online (Sandbox Code Playgroud)

PATH_TO_UPLOAD是用户上传数据的路径。这是FULL_PATH_OF_MEDIA的子目录,这意味着上传的文件将包含

FULL_PATH_OF_MEDIA/PATH_TO_UPLOAD 
Run Code Online (Sandbox Code Playgroud)

完整路径。现在可以在以下网址访问此内容:

SITE_NAME/URL_OF_MEDIA/PATH_TO_UPLOAD
Run Code Online (Sandbox Code Playgroud)

我还建议在static_files vs media_files上阅读此内容

doc