13

我已经建立了一个使用图像的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

更新:忘了提到我正在使用内置的开发服务器。

4

6 回答 6

14

仅用于开发

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

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

我将 myMEDIA_ROOT放在 html/media 的子目录中并链接到它settings.py

MEDIA_ROOT = os.path.join(os.path.dirname(__file__), 'html/media/').replace('\\','/')

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

于 2008-12-31T21:51:00.277 回答
12

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

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

于 2008-12-31T12:13:01.817 回答
5

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

模型.py:

UserProfile:
    profilePic= models.ImageField( upload_to='PATH_TO_UPLOAD', blank=True, null=True)

设置.py:

MEDIA_ROOT = 'FULL_PATH_OF_MEDIA'
MEDIA_URL = 'URL_OF_MEDIA'

网址.py:

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

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

FULL_PATH_OF_MEDIA/PATH_TO_UPLOAD 

完整路径。现在可以通过此 url 访问此内容:

SITE_NAME/URL_OF_MEDIA/PATH_TO_UPLOAD

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

文档

于 2016-04-02T07:36:52.773 回答
3

您可以将这些行添加到您的 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}), 
    ]
于 2021-02-12T21:28:56.373 回答
1

我怀疑您正在获取 Django 404 页面。尝试直接访问您的一张图像,看看是否发生这种情况。

如果是这样,您需要将 Web 服务器配置为将媒体层次结构中的请求发送到 Django,而是直接为它们提供服务。这是我的 Apache conf 文件中的一个片段。第一部分告诉 Apache 将所有内容发送给 Django。第二部分有“SetHandler None”,它表示“以正常方式处理 /media 下的内容”。

有关所有令人兴奋的细节,请参阅http://docs.djangoproject.com/en/dev/howto/deployment/modpython/

PrinceOfPinot.com(AKA pop)的部分 httpd.conf 文件:

<Location "/">
    SetHandler python-program
    PythonAutoReload Off
    PythonDebug Off
    PythonPath "['/var/www/production/pop', '/usr/local/lib/python2.5/site-packages/django'] + sys.path"
    SetEnv DJANGO_SETTINGS_MODULE settings
    PythonHandler django.core.handlers.modpython
</Location>

<Location "/media">
    SetHandler None
    AddOutputFilterByType DEFLATE text/html text/css application/x-javascript
</Location>
于 2008-12-31T17:52:08.840 回答
1

我知道最初的问题是与开发服务器有关,但对于其他正在寻找生产环境答案的人来说:

https://docs.djangoproject.com/en/1.8/howto/static-files/deployment/提供了有关如何让 django 在生产环境中提供文件的指南。从指南的语气来看,它似乎暗示最好有一个单独的 Web 服务器来处理文件或将 mod_wsgi 与 Apache 一起使用

于 2015-11-12T16:44:19.107 回答